快速排序

在正式开始前,先给大家讲个鬼故事,叫作我不会用sort
是的,相信你的眼睛,你没有看错(皮一把)
那么,开始写快排吧。
基本思想:一趟排序将待排记录分2部分,
一部分的关键字均比另一部分小,再分别对这两部分排序
是不是有点懵,没关系的,我们来个具体一点的
首先从中间选一个数记为支点(mid),
然后将关键字小于它的都扔在左子序列中,反之则扔在右子序列中
这就是一趟快速排序了(真聪明)。
是不是还是很懵,那么我们再具体一点吧
设2个指针i,j(初始值1,len),支点叫做mid,
从j开始向前搜到第一个小于mid的记录,然后从i开始向后搜到第一个大于mid的记录,将它们交换直到i>j
多么小巧玲珑美观大方的算法啊,那么上代码?(其实没有这个必要了)
所以啊,就给个函数吧
void qsort(int l,int len){
int i,j,mid;
int i=l,j=len;
mid=a[(l+len)/2];//支点(挡板)
do{
while(a[i]<mid)i++;
while(a[j]>mid)j–;//不考虑会有相等的数
if(i<j){
swap(a[i],a[j]);//这里插一句,swap要用什么函数库不?
i++;j–;//继续找
}while(i<=j)//为了排完采用do{}while,注意等号不能漏!!
//递归的精髓来了,准备好了吗
if(l<j) qsort(l,j);
if(i<len) qsort(i,len);//未到边界则递归搜索左右区间
}
写作业去了,大家晚安

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值