在正式开始前,先给大家讲个鬼故事,叫作我不会用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);//未到边界则递归搜索左右区间
}
写作业去了,大家晚安
快速排序
最新推荐文章于 2024-09-12 15:56:42 发布