具體寫了幾個簡單的排序,其中swap函式使用了異或的方法實現:
/**
* 交換陣列中的兩個數,一個數自己與自己異或結果為0;一個數與0異或,結果還是自己。
*
* @param arr
* @param i
* @param j
*/
public static void swap(int[] arr, int i, int j) {
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
複製程式碼
此前用它實現氣泡排序和插入排序都沒有問題,在實現選擇排序的時候會出現錯誤,並且會莫名其妙地多出許多0出來,換做普通方法實現的排序又是對的。
// public static void swap(int[] arr, int i, int j) {
// int temp = arr[i];
// arr[i] = arr[j];
// arr[j] = temp;
// }
複製程式碼
後來百度找到了答案。
public static void selectionSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
for (int i = 0; i < arr.length - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex])
minIndex = j;
}
swap(arr, i, minIndex);//這一行
}
}
複製程式碼
在執行到最後一行的時候,如果之前minIndex沒有改變過,則i與minIndex是相等的,在進行swap()的時候,arr[i] = arr[i] ^ arr[j];
相當於對兩個相同的數做異或運算,結果是0。swap函式出現錯誤。可以在swap函式加上if(i==j)return;
來解決。