我們知道,在排序算法中經常會需要交換序列中的兩個變量,常見有兩種方法:
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
{
public void sort(int[] array)
{
for(int i = 0; i < array.length; i++)
{
// 在待排序列裏找到最小的數子
int index = i;
for(int j = i+1; j < array.length; j++)
{
if(array[index] > array[j])
{
index = j;
}
}
// 交換 這種交換是OK的
// int temp = array[i];
// array[i] = array[index];
// array[index] = temp;
// 這種交換必須先判斷index和i不相等,否則會使改變量變爲0,
if(index != i)
{
// 一下方法交換有一個缺陷就是當兩個數相等的時候,無法實現交換並且會將其值改爲0
array[i] = array[i] ^ array[index];
array[index] = array[i] ^ array[index];
array[i] = array[i] ^ array[index];
}
// 下面這種交換就完全沒有問題,因爲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];
*/
}
}
}