利用抽屉原理(鸽巢原理排序)对数列排序
抽屉原理
桌上有十个苹果,要把这十个苹果放到九个抽屉里,无论怎样放,我们会发现至少会有一个抽屉里面放不少于两个苹果。这一现象就是我们所说的“抽屉原理”。 抽屉原理的一般含义为:“如果每个抽屉代表一个集合,每一个苹果就可以代表一个元素,假如有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