不用辅助内存交换两个数的值
2017-05-22 00:11
190 查看
首先先来看一下我们常用的交换算法,使用了一个辅助变量
那么,怎么才能不用到这个辅助变量呢?
这里用到辅助变量是因为在更改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是为了方便区分和理解)
这里使用加减不会出现中间和a+b溢出造成最终结果错误的问题,不信可以试一下,原因在于计算机中整数是使用补码计算的,而补码的加法运算是符合结合律的,所以整数加法也是符合结合律的,a + b - b = a+(b+(-b)) = a。
但不能用乘除,因为会有中间乘积溢出造成的结果错误。
类似的还可以通过异或,利用相同数异或抵消的性质达到同样的效果,效率会更高。
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; }
相关文章推荐
- 不用临时的变量 交换两个数的两种方法
- 两个数交换不用其他变量
- 怎样不用中间变量temp 实现两个数交换
- 不用临时变量交换两个数的值
- 不用临时变量交换两个数的值
- 不用辅助变量交换两个整数的值。真的很简单吗?
- 00003 不用第三片空间实现两个数的交换
- 怎样不用中间变量temp 实现两个数交换
- 不用临时变量交换两个数的值
- 不用中间变量交换两个数
- 不用临时变量交换两个数的值(C实现)
- 不用临时变量交换两个数的值
- c语言不用临时变量交换两个数程序分析
- 不用临时变量交换两个数的值
- php不用第三个变量,交换两个数的值
- 不用中间变量,交换两个数的值
- 不用临时变量实现两个数的交换
- C语言基础篇(2):按位比较是否相等、找出不是成对出现的单数、不用中间变量实现两个数的交换
- 不用临时变量交换两个数的值
- c语言不用临时变量交换两个数程序分析