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

首先先来看一下我们常用的交换算法,使用了一个辅助变量

    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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值