文章目錄
- 選擇排序正確代碼
- 交換兩個數位置的方法
- 引入中間變量
- 不引入中間變量,使用異或的方法
- 錯誤原因
- 優化代碼
選擇排序正確代碼
// 數組中交換i和j位置的數public static void swap(int[] arr, int i, int j) {int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}// 選擇排序//選擇待排數據中最小的,與數組最左側的數據進行交換public static void selectionSort(int[] arr) {if (arr == null || arr.length < 2) {return;}for (int minIndex, i = 0; i < arr.length - 1; i++) {minIndex = i;//因為每一次都會排好前面的位置,所以每次 都要重新給minIndex賦值; 然后數組剩余數字進行遍歷,找出最小值然后交換for (int j = i + 1; j < arr.length; j++) {//當 j = i 時,會無意義地比較 arr[i] 和 arr[minIndex](此時 minIndex = i),即 arr[i] 和自己比。if (arr[j] < arr[minIndex]) {minIndex = j;}}swap(arr, i, minIndex);}}
交換兩個數位置的方法
引入中間變量
正確,可以使用
public static void swap(int[] arr,int i,int j){int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}
不引入中間變量,使用異或的方法
這種方法有問題不能使用!!
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];}
錯誤原因
異或交換不能處理i == j的情況,會導致數據被錯誤地置 0。
因此使用時 我們推薦先判斷兩數是否相等