我們知道,在排序演算法中經常會需要交換序列中的兩個變數,常見有兩種方法:
1.借助第三個臨時變數
// 交換
int temp = array[i];
array[i] = array[index];
array[index] = temp;
2.借助異或運算的特性
array[i] = array[i] ^ array[index];
array[index] = array[i] ^ array[index];
array[i] = array[i] ^ array[index];
以上兩種方式都實現了array[i]和array[index]的交換,但是第二種方法的使用有乙個前提:i和index不能相等。
當然,理論上來說如果i和index相等的話,那就是同乙個值,有什麼必要交換呢?
確實如此,但是我在寫選擇排序的時候就遇到了這個問題,
大家不妨看看。
package com.sort;
/** * 選擇排序類
* 思路:每次從待排序列中選擇最小的數 放在這個待排序列裡面的第一位(和第一位交換)
* @author maggie
* */
public class selectsort
}// 交換 這種交換是ok的
// int temp = array[i];
// array[i] = array[index];
// array[index] = temp;
// 這種交換必須先判斷index和i不相等,否則會使改變量變為0,
if(index != i)
// 下面這種交換就完全沒有問題,因為j和j+1是不可能相等的,便不會存在那樣的問題
/**// 中間量
array[j] = array[j] ^ array[j+1];
// 交換:此時的array[j+1]其實是原來的array[j]
array[j+1] = array[j] ^ array[j+1];
// 交換:此時的array[j]其實是原來的array[j+1]
array[j] = array[j] ^ array[j+1];
*/} }
}
使用異或運算 不借助臨時變數交換兩個數
通常交換兩個變數需借助乙個臨時變數,如 int temp temp a a b b temp 使用異或可以不借助臨時變數交換兩個數 a a b b a b a a b 這是用了異或的自反性性質做到的 a b b a 0 a 具體推導過程 第一步 a a b 第二步 b a b a b b a 經過第...
異或運算的妙用,兩個整型變數交換位置
異或運算符號 按照二進位制的位進行異或運算 兩個位分別為1 0 不分前後 結果為1,其他都為0 例如十進位制 二進位制 1 12 10 3 11 4 100 5 101 1 2結果二進位制就是11 轉換成十進位制就是3 4 5結果是1 轉換成十進位制還是1 根據上面的我們再來看 1 2 3 3 2 ...
異或運算實現兩個數的交換
通常的交換兩個變數a,b的過程為 int temp temp a a b b temp 需借助上面的第3個臨時變數temp.採用下面的方法,對於給定兩個整數a,b,下面的異或運算可以實現a,b的交換,而無需借助第3個臨時變數 a a b b a b a a b 這個交換兩個變數而無需借助第3個臨時變...