算法与数据结构(C++)之简单排序算法

交换

两个数交换,一种思想是通过创建一个中间变量来当作桥梁;
另一种思想是通过位运算,两个数异或,如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
同时异或可以看作无进位相加,异或也满足交换律和结合律
交换:
a=甲
b=乙
//经过下面三步完成交换
a=a异或b;就是 a=甲 异或 乙,b还是乙
b=a异或b;就是 b= (甲 异或 乙)异或 乙=甲 异或(乙 异或 乙)=甲 异或 0=甲,a还是(甲 异或 乙)
a= a异或 b;就是 a = (甲 异或 乙) 异或 甲 =0 异或 乙=乙,b=甲
完成交换

注意:这样操作的前提是两个数在内存中是两块独立的区域

引申:
例一:有一个整型数组,数组中有一个数出现了奇数次,其他数出现了偶数次,怎么找出这个数,

	int arr[] = {
    1,2,3,1,1,2,1 };
	int a = 0;//用a和数组中的每个数进行异或
	//由于异或满足交换律,
	//等价于a和数组{1,1,1,1,2,2,3}进行异或
	//又异或满足结合律
	//可以数组中的数先异或,再和a异或,
	for(int i = 0; i <sizeof(arr)/sizeof(int);i++)
	{
   
		a = a^ arr[i];
	}
	cout << "数组中出现奇数次的数为:" << a << endl;

例二:有一个整型数组,数组中有两种数出现了奇数次,其他数出现了偶数次,怎么找出这两种数,

int arr[] = {
    1,2,3,1,1,2};
int eor = 0;
for(int i = 0; i <sizeof(arr)/sizeof(int);i++)
{
   
	eor = eor^ arr[i];
}
//假设数组中出现奇数次的两种数为 a、b
//上面代码执行完后,eor的结果就为 a异或b 
// eor = a ^ b;又因为两种数,所以a  b肯定不相等,eor即在二进制上有一位不为0,为1
	
//eor在某一位上为1,在这位上,a和b是不一样的,所以根据这一位来划分数组,分成两组

//选择最右侧的1那一位,像00001000
int rightOne = eor & (~eor + 1);

//再创建一个变量,
int onlyOne = 0;
//该变量和数组中rightOne那位上为1的那一组进行异或,找出a或者b
for (int i = 0; i < sizeof(arr) / sizeof(int); i++)
{
   
	if ((arr[i] & rightOne) != 0)//找出那一位上为1的那一组
	{
   
		onlyOne = onlyOne ^ arr[i];
	}
}
//onlyOne找出a或者b
cout << "一个数为:" << (eor ^ onlyOne) << endl;//假如找出的onlyOne为a
//a^b^a=b
cout << "另一个数为:" << onlyOne << endl;

以下排序用的交换

void swap(int arr[], int i, int j)
{
   
	arr[i] = arr[i] ^ arr[j];
	arr[j] = arr[i] ^ arr[j];
	arr[i] = arr[i] ^ arr[j];
}

简单排序算法

选择排序

总共n个数,
第 1 轮,找从 0 到 n-1 这 n 个数中的最小值,把最小值和第 0 位置上的数进行交换 ,即把最小值放到第 0 位置上
第 2 轮,找从 1 到 n-1 这 n-1 个数中的最小值,把最小值和第 1 位置上的数进行交换, 即把最小值放到第 1 位置上
。。。。。。
第 i 轮,找从 i-1 到 n-1 这 n-i+1 个数中的最小值, 把最小值和 第 i-1 位置上的数进行交换
。。。。。。
第 n-1 轮,找从 n-1-1 到 n-1 这 n-1-(n-1-1)+1=2 个数中的最小值,把最小值放到第 n-1-1 位置上
第n轮,剩下一个数,可以不比,

总共 n-1 轮 ,
第1轮,从n个数中找最小值
第2轮,从n-1个数找最小值
。。。
第i轮,从n-i+1个数找最小值


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值