利用鸽巢原理(抽屉原理排序)对数列排序

利用抽屉原理(鸽巢原理排序)对数列排序

抽屉原理

桌上有十个苹果,要把这十个苹果放到九个抽屉里,无论怎样放,我们会发现至少会有一个抽屉里面放不少于两个苹果。这一现象就是我们所说的“抽屉原理”。 抽屉原理的一般含义为:“如果每个抽屉代表一个集合,每一个苹果就可以代表一个元素,假如有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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值