Swap two numbers


在上一篇介绍排序算法的文章中经常会用到交换两数,可用的方法很多,有使用临时内存的交换方式与不使用临时内存的方式。本文简单总结三种以及相对应的注意点。

临时变量

最常见的交换两数方法借助一个临时变量实现。

int tmp = a;
a = b;
b = tmp;

Java由于对普通类型的变量不支持引用传递,没办法像C/C++一样单独写一个swap函数。C/C++函数可以传递引用传递指针。

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

算术运算

利用加减或者乘除或者位运算的运行性质完成两数的交换,这种方式不开辟新的内存,效率较高。

加减/乘除

直接看代码。

a = a + b; //此时a为a+b
b = a - b; //b为a+b-b
a = a - b; //a为a+b-a

同理乘除也可。

a = a * b;
b = a / b;
a = a / b;

位运算

利用异或的性质,同样可以实现不使用临时变量交换两数。我们知道x ^ x = 0x ^ 0 = x,再结合异或的交换律可以得出x ^ y ^ x = x ^ x ^ y = y

a ^= b;
b ^= a;
a ^= b;

两种不使用临时变量的交换方式在使用时要注意,ab两数的地址不能相同,否则值会变为0。

  #Data Structure 

« Sorting Algorithms Stack and Queue - Notes »