【陷阱】交换排序中交换动作的陷阱
static void swap(int[] data, int i, int j) { //记得加此条件,data[i]与data[j]相同时异或运算得0 if (data[i] != data[j]) { data[i] = data[i] ^ data[j]; data[j] = data[i] ^ data[j]; data[i] = data[i] ^ data[j]; } } static void sort(int[] data, int begin, int end) { if (begin < end) { int cur = data[begin]; int i = begin; int j = end + 1; while (true) { while (i < end && cur >= data[++i]) ; while (j > begin && cur <= data[--j]) ; if (i < j) { swap(data, i, j); } else { break; } } swap(data, begin, j); sort(data, begin, j - 1); sort(data, j + 1, end); } } public static void main(String[] args) { int[] data = { 2, 1, 3, 8, 4, 9 }; sort(data, 0, 5); System.out.println(Arrays.toString(data)); }
在上述例子中有3^3的情形发生,最后得出0导致排序有误。
用异或运算进行数组元素互换时记得比较连个元素值是否相等。