使用異或運算交換兩個變量的危險

我們知道,在排序算法中經常會需要交換序列中的兩個變量,常見有兩種方法:

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];
			*/
		}
	}
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章