利用鴿巢原理(抽屜原理排序)對數列排序

利用抽屜原理(鴿巢原理排序)對數列排序

抽屜原理

桌上有十個蘋果,要把這十個蘋果放到九個抽屜裏,無論怎樣放,我們會發現至少會有一個抽屜裏面放不少於兩個蘋果。這一現象就是我們所說的“抽屜原理”。 抽屜原理的一般含義爲:“如果每個抽屜代表一個集合,每一個蘋果就可以代表一個元素,假如有n+1個元素放到n個集合中去,其中必定有一個集合裏至少有兩個元素。” 抽屜原理有時也被稱爲鴿巢原理。它是組合數學中一個重要的原理

測試案例

給定一個範圍在 1 ≤ a[i] ≤ n ( n = 數組大小 ) 的 整型數組,數組中的元素只出現一次,但不是有序的。
如[4,6,2,7,8,5,3,1 ],經過抽屜原理排序後爲[1,2,3,4,5,6,7,8].

代碼

void SwapData(vector<int>& nums, int index_a, int index_b)
{
	nums[index_a] = nums[index_a] ^ nums[index_b];
	nums[index_b] = nums[index_a] ^ nums[index_b];
	nums[index_a] = nums[index_a] ^ nums[index_b];
}
int main()
{

	vector<int> data{ 4,6,2,7,8,5,3,1 };
	for (int i = 0; i < data.size(); i++)
	{
		while (data[i] != data[data[i] - 1])
		{
			SwapData(data, i, data[i] - 1);
		}
	}
	for (int i = 0; i < data.size(); i++)
		cout << data[i] << "-";


}

在這裏插入圖片描述

補充異或運算規則

如果 a ^ b = c ,那麼 a ^ c = bb ^ c = a 同時成立,利用這一條,可以用於交換兩個變量的值。於是,交換兩個變量的值,例如 a 和 b,不使用第三個變量,可以這樣做:

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