利用抽屜原理(鴿巢原理排序)對數列排序
抽屜原理
桌上有十個蘋果,要把這十個蘋果放到九個抽屜裏,無論怎樣放,我們會發現至少會有一個抽屜裏面放不少於兩個蘋果。這一現象就是我們所說的“抽屜原理”。 抽屜原理的一般含義爲:“如果每個抽屜代表一個集合,每一個蘋果就可以代表一個元素,假如有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 = b 與 b ^ c = a 同時成立,利用這一條,可以用於交換兩個變量的值。於是,交換兩個變量的值,例如 a 和 b,不使用第三個變量,可以這樣做:
a = a ^ b
b = a ^ b
a = a ^ b