在使用异或交换数组值的时候,可以使用异或,不用临时变量。
但是这个方法当i与j相等时,相当于始终对一个数自己进行异或,我们知道两个一样的数异或结果为0
假如i==j 则
a[i] = a[i] ^ a[j]; //结果为0 则此时a[i]=a[j]=0
a[j] = a[i] ^ a[j]; // = 0 ^ 0 = 0;
a[i] = a[i] ^ a[j]; // = 0
所以最后结果为0
添加一行判断问题解决。
private void swap(int[] a, int i, int j) {
if (i == j){return;}//关键
a[i] = a[i] ^ a[j];
a[j] = a[i] ^ a[j];
a[i] = a[i] ^ a[j];
System.out.println("swap:" + a[j] + " <-> " + a[i]);
}