今天浏览博客是发现在排序算法中数据置换时采用的是异或计算的方法,而在评论区又看到了客友对其博主的询问,所以今天浅谈一下这样一个小技巧。
请看代码:
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int[] a = {5, 6, 1, 8, 6, 5, 9, 2, 3};
bubbleSort(a);
System.out.println(Arrays.toString(a));
}
/**
* 传统的赋值交换,我们采用申明中间变量的方法进行复制
* @param a
* @param i
* @param j
*/
private static void swap01(int[] a, int i, int j) {
int tmpt = a[j];
a[j] = a[i];
a[i] = tmpt;
}
//a[i] ^= a[j]; 等同于a[i] = a[i]^a[j],少写点 只写8位
//假定此时是6,1;第一步:a[i]=0000 0110 ,a[j] = 0000 0001;
/**
* 计算后
* 0000 0110
* 0000 0001 ^
* -------------
* a[i] 0000 0111
*
* 第二步:
* 0000 0001
* 0000 0111 ^
* ----------------
* a[j] 0000 0110
*
* 第三步:
* 0000 0111
* 0000 0110 ^
* -------------
* a[i] 0000 0001
*
*/
private static void swap(int[] a, int i, int j) {
a[i] ^= a[j];
a[j] ^= a[i];
a[i] ^= a[j];
}
private static void bubbleSort(int[] a) {
int length = a.length;
for (int i = 0; i < length - 1; i++) {
for (int j = 0; j < length - i - 1; j++) {
if (a[j + 1] < a[j])
//swap(a,j+1,j);
swap01(a, j + 1, j);
}
}
}
}
总结:此计算技巧,其实是两个值经过一次计算得到的值再与其中的一个值进行异或运算又可以得到另一个值。
比如在int取一半的时候我也更喜欢用位运算符,int j = 6; int half = j >> 1;