快速排序

排序前将s[i]做为标杆,不挖坑,比较后直接交换。
先从最右边比较,然后左边,
将比标杆小的数全部放到左边

void quick_sort(int s[], int l, int r) { //l,r为最左和最右下标
		if (l < r) {   //判断条件防止递归错误
			int i = l, j = r;
			while (i < j) {
				while (i < j) {
					if (s[i] > s[j]) { //条件成立直接交换
						std::swap(s[i], s[j]);
						i++;          //交换完成,将下标加1,为下一次比较做准备.(也可省略)
						break;       
					}
					j--;
				}
				while (i < j) {
					if (s[j] < s[i]) {
						std::swap(s[i], s[j]);
						j--;               //可省略,影响效率,不影响结果
						break;
					}
					i++;
				}
			}
			quick_sort(s, l, i - 1);  //右半递归
			quick_sort(s, i + 1, r);  //左半递归
		}
	}

第二种解法,
每次比较前,先比较标杆下一位是否比标杆小,如果小,交换
然后再从最右边开始比较,如果找到目标,将目标移到标杆位,
将标杆下移一位,标杆的下一位放到目标位。

void quick_sort(int s[], int l, int r) { //l,r为最左和最右下标
	if (l < r) {   //判断条件防止递归错误
		int i = l, j = r;
			
		while (i < j) {   
			while((s[i]>s[i+1])&&(i<j)){
				std::swap(s[i],s[i+1]);
				i++;
				}			
			if (s[i] > s[j]) { 
				
					int temp = s[i+1];
					s[i+1]=s[i];
					s[i]=s[j];
					s[j]=temp;
					 i++;     
				}
			j--;
			}
	
		quick_sort(s, l, i - 1);  //右半递归
		quick_sort(s, i + 1, r);  //左半递归
	}
}

网上也有很多其他方法,可以多看看,找一种自己能理解的,效率高的熟悉算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值