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

2021-09-24 07:43:39 字數 753 閱讀 5514

具體寫了幾個簡單的排序,其中swap函式使用了異或的方法實現:

/**

* 交換陣列中的兩個數,乙個數自己與自己異或結果為0;乙個數與0異或,結果還是自己。

* * @param arr

* @param i

* @param j

*/public static void swap(int arr, int i, int j)

複製**

此前用它實現氣泡排序和插入排序都沒有問題,在實現選擇排序的時候會出現錯誤,並且會莫名其妙地多出許多0出來,換做普通方法實現的排序又是對的。

//	public static void swap(int arr, int i, int j) 

複製**

public static void selectionsort(int arr) 

for (int i = 0; i < arr.length - 1; i++)

swap(arr, i, minindex);//這一行

} }複製**

在執行到最後一行的時候,如果之前minindex沒有改變過,則i與minindex是相等的,在進行swap()的時候,arr[i] = arr[i] ^ arr[j];相當於對兩個相同的數做異或運算,結果是0。swap函式出現錯誤。可以在swap函式加上if(i==j)return;來解決。

交換的異或實現

如果想交換 a 和 b 的值,我們通常的做法是 宣告乙個臨時變數 temp,然後再實現互換,這種方式常見的讓我幾乎認為 就應該這樣做,但今日拜讀 深入理解計算機系統 一書時,卻發現了另一種巧妙的實現方式,不用第三個位置來臨時儲存,只需位操作 異或 即可。定義 a b a b ab a 為非a 1 1...

HIHOCODER 1509 異或排序

給定乙個長度為 n 的非負整數序列 a 1.n 你需要求有多少個非負整數 s 滿足以下兩個條件 1 0 s 260 2 對於所有 1 i n 有 a i xor s a i 1 xor s 第一行乙個正整數 n 第二行 n 個非負整數表示序列 a 1.n 1 n 50 0 a i 260 乙個非負正...

XOR (異或)加密簡單實現

參考 一 xor 運算 邏輯運算之中,除了 and 和 or,還有一種 xor 運算,中文稱為 異或運算 它的定義是 兩個值相同時,返回false,否則返回true。也就是說,xor可以用來判斷兩個值是否不同。true xortrue false false xo lse false true xo...