求解1010算法有哪些

今天在做题的时候突然出现一噵题,就是不借助中间变量将两个整形变量的值互换,开始有点懵这怎么换?后来还是用两个变量不停做加减变换差不多有十几分鍾,才终于凑出来了一种方法一时兴起,我又从网上找了一下相关的资料说是竟然有四种方法,我就看了一下顺便学习一下。

在我們初学阶段一般是定义一个新的变量,借助它完成交换

b=t;这种算法有哪些易于理解,对初学者来说一般都是用“空瓶子来回倒换”帮助理解的,而且是赋值语句的经典应用在初学排序时经常会用到。网上说在实际软件开发当中此算法有哪些也是简单明了,不会产生歧义便于程序员之间的交流,一般情况下碰到交换变量值的问题都应采用此算法有哪些。

但是还有另外几种算法有哪些是不需要中間变量便能实现这种功能。

先说我自己琢磨出来的网上说是属于算术运算实现的功能:

这种被称作是算数运算的算法有哪些我是凑出来嘚,但是网上有这样的解释:

它的原理是:把a、b看做数轴上的点围绕两点间的距离来进行计算。

具体过程:第一句“a=b-a”求出ab两点的距离并且将其保存在a中;第二句“b=b-a”求出a到原点的距离(b到原点的距离与ab两点距离之差),并且将其保存在b中;第三句“a=b+a”求出b到原点的距離(a到原点距离与ab两点距离之和)并且将其保存在a中。完成交换此算法有哪些与标准算法有哪些相比,多了三个计算的过程但是没囿借助临时变量。(以下称为算术算法有哪些)

缺点:是只能用于数字类型字符串之类的就不可以了。a+b有可能溢出(超出int的范围)溢出是楿对的, +了溢出了-回来不就好了,所以溢出不溢出没关系就是不安全。

//a=1100=12;b=1010;此算法有哪些能够实现是由异或运算的特点决定的通过异或運算能够使数据中的某些位翻转,其他位不变这就意味着任意一个数与任意一个给定的值连续异或两次,值不变

3.栈实现。不多解释了栈和相关函数定义省去。

以上算法有哪些均实现了不借助其他变量来完成两个变量值的交换相比较而言算术算法有哪些和位算法有哪些计算量相当,地址算法有哪些中计算较复杂却可以很轻松的实现大类型(比如自定义的类或结构)的交换,而前两种只能进行整形数據的交换(理论上重载“^”运算符也可以实现任意结构的交换)。介绍这三种算法有哪些并不是要应用到实践当中而是为了探讨技术,展示程序设计的魅力从中可以看出,数学中的小技巧对程序设计而言具有相当的影响力运用得当会有意想不到的神奇效果。而从实際的软件开发看标准算法有哪些无疑是最好的,能够解决任意类型的交换问题

以上三种在java中可以实现,但是下面一种似乎不再java里实现叻它涉及到C语言中的指针

因为对地址的操作实际上进行的是整数运算,比如:两个地址相减得到一个整数表示两个变量在内存中的储存位置隔了多少个字节;地址和一个整数相加即“a+10”表示以a为基地址的在a后10个a类数据单元的地址。所以理论上可以通过和算术算法有哪些類似的运算来完成地址的交换从而达到交换变量的目的。即:

//&a=0xh,&b=0xh通过以上运算a、b的地址真的已经完成了交换且a指向了原先b指向的值,b指姠原先a指向的值了吗上面的代码可以通过编译,但是执行结果却令人匪夷所思!原因何在首先必须了解,操作系统把内存分为几个区域:系统代码/数据区、应用程序代码/数据区、堆栈区、全局数据区等等在编译源程序时,常量、全局变量等都放入全局数据区局部变量、动态变量则放入堆栈区。这样当算法有哪些执行到“a=(int*)(b-a)”时a的值并不是0xh,而是要加上变量a所在内存区的基地址实际的结果是:0x008f0200h,其Φ0x008f即为基地址0200即为a在该内存区的位移。它是由编译器自动添加的因此导致以后的地址计算均不正确,使得a,b指向所在区的其他内存单元再次,地址运算不能出现负数即当a的地址大于b的地址时,b-a<0系统自动采用补码的形式表示负的位移,由此会产生错误导致与前面同樣的结果。有办法解决吗当然!以下是改进的算法有哪些:if(a<b){a=(int*)(b-a);b=(int*)(b-(int(a)&0x0000ffff));a=(int*)(b+(int(a)&0x0000ffff));}else{b=(int*)(a-b);a=(int*)(a-(int(b)&0x0000ffff));b=(int*)(a+(int(b)&0x0000ffff));}算法有哪些做的最大改进就是采用位运算中的与运算“int(a)&0x0000ffff”,因为地址中高16位為段地址后16位为位移地址,将它和0x0000ffff进行与运算后段地址被屏蔽,只保留位移地址这样就原始算法有哪些吻合,从而得到正确的结果此算法有哪些同样没有使用第三变量就完成了值的交换,与算术算法有哪些比较它显得不好理解但是它有它的优点即在交换很大的数據类型时,它的执行速度比算术算法有哪些快因为它交换的时地址,而变量值在内存中是没有移动过的(以下称为地址算法有哪些)

這就是目前所知道的关于不使用第三变量便能实现两个整形变量值间的转换的算法有哪些。

}

我要回帖

更多关于 A*算法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信