临时变量法

这个相信大家都知道,刚学编程时应该都会学到这种交换值的方法。

虽然用到了1的额外空间,但这是最容易理解,效率也是最高的一种方法。

public void swap(int[] array, int i, int j) {
    int temp = array[i];
    array[i] = array[j];
    array[j] = temp;
}

加减法

先假设a = 1 , b = 2,要交换 a 和 b 。

  1. 执行a = a + b,现在 a 就是 a + b。
  2. 执行b = a - b,b 就相当于 a + b - b 等于原来的 a ,b 就变成 a 了。
  3. 执行a = a - b,现在 b 就是原来的 a ,a 就相当于 a + b - a 就等于原来的 b,a 变成 b 了。
public void swap(int[] array, int i, int j) {
    array[i] = array[i] + array[j];
    array[j] = array[i] - array[j];
    array[i] = array[i] - array[j];
}

注意,该方法有溢出的风险。

异或法

我们知道,有两条异或性质。

  1. 任何数和0异或,都得任何数。
  2. 任何数与自身异或,都得0。

在这里,我们就用到了第2条,道理和加减法差不多,只是运算变为了异或,而且不会有溢出问题。

public void swap(int[] array, int i, int j) {
    array[i] = array[i] ^ array[j];
    array[j] = array[i] ^ array[j];
    array[i] = array[i] ^ array[j];
}

小结

后两种方法因为需要运算,而异或法又要比加减法好些,比第一种慢点,但没有使用额外空间。

后两种方法只是用于装逼,看起来很高级的样子,在实际操作中还是使用第一种为好。


02-11 10:49