選擇排序中用異或實現swap()時出現的問題

快樂的博格巴發表於2018-10-10

具體寫了幾個簡單的排序,其中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;來解決。

相關文章