您的位置:首页 > 其它

不用辅助内存交换两个数的值

2017-05-22 00:11 190 查看
首先先来看一下我们常用的交换算法,使用了一个辅助变量

void swap(int &a, int&b){
int temp = a;
a = b;
b = temp;
}


那么,怎么才能不用到这个辅助变量呢?

这里用到辅助变量是因为在更改a=b后要保留原有a的信息,如果想不用辅助变量,就要在已有的a和b中储存足够的信息。

所以我们尝试在b中储存a的信息,同时又要保留b的信息,不然无法将a赋为b。

比如我们可以将b赋为newb = a+b,之后修改a为newa = newb-a = a+b-a = b, 修改newb = newb - newa = a+b-b = a。(这里使用newa和newb是为了方便区分和理解)

void swap(int &a, int&b){
b = a + b;
a = b - a;
b = b - a;
}


这里使用加减不会出现中间和a+b溢出造成最终结果错误的问题,不信可以试一下,原因在于计算机中整数是使用补码计算的,而补码的加法运算是符合结合律的,所以整数加法也是符合结合律的,a + b - b = a+(b+(-b)) = a。

但不能用乘除,因为会有中间乘积溢出造成的结果错误。

类似的还可以通过异或,利用相同数异或抵消的性质达到同样的效果,效率会更高。

void swap(int &a, int&b){
b = a ^ b;
a = b ^ a;
b = b ^ a;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 swap 交换