挑战二--第七章高等排序(三)

本文详细介绍了快速排序算法的工作原理及其实现过程。快速排序通过选取一个基准值将数组分为两部分,使得一部分的所有元素都比另一部分的元素小,然后递归地对这两部分继续进行同样的操作,最终达到整个数组有序的状态。文中还提供了具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速排序

很好理解?类似于归并排序,归并排序每次将数组分成两个有序数组最后再将一步一步把小的数组“整合”起来

快速排序的本质就是将一整个数组不断缩小范围排序,只不过因为在分割的时候就已经排序前面的一定比分界值小,后面的一定比分界值大,然后一步一步分下去直至最后就已经排好,不需要像归并排序一样手动合并。

平均时间复杂度为O(nlogn)。

需要注意的是快速排序的规定值的选取,最坏的情况将把复杂度高达O(n²).......这我就不仔细找了。。因为并没有遇到这样的题。。还是先乖乖的就拿最后一个值当分界值好了。。。。


实现代码

int partition(Card a[],int n,int p,int r){
	int i,j;
	Card t,x;
	x=a[r];
	i=p-1;
	for(j=p;j<r;j++){
		if(a[j].v<=x.v){
			i++;
			t=a[i],a[i]=a[j],a[j]=t;
		}
	}
	t=a[i+1];a[i+1]=a[r];a[r]=t;
	return i+1;
}

void q_sort(Card a[],int n,int p,int r){
	int q;
	if(p<r){
		q=partition(a,n,p,r);
		q_sort(a,n,p,q-1);
		q_sort(a,n,q+1,r);
	}
}

其实就是在分割下面多了一个调用的函数,先将大数组分割成两个小数组再分别将两个小数组进行分割处理。知道不可再分割已经将整个数组排好。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值