通俗易懂排序算法之快速排序

快速排序

简介

快速排序是对起泡排序的一种改进,它的基本思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,这两部分的记录是分别位于枢轴(刚开始你自己设定的)两边,并且左右两部分的内部也是无序的,只有枢轴在数组中的位置是正确的。这一趟可以确定一个数的位置。对于小白来说,这些话有些废,我刚开始学的时候看书就是这样觉得 还是先看举例过程吧!然后看看代码,原理嘛 ,过程懂了,肯定好懂

举例

专心看例子,其他先不要想。
假如上体育课按身高排序站队,你呢,是比较中等的身高。而你要找到你是第几个位置,别人的你不用管!怎么找呢!
第一步:让其他同学挨个跟你比身高,小A比你高,那小A要站在你后面,小B比你低,小B到你前面,小c比你高,小c站你后面,那小A和小c都在你后面,她两到底谁前谁后呢? 管他呢,反正他俩在你后面就成,》》》一顿操作猛如虎,欧克,等所有同学都比完了,你就查数,从前往后,你是第几个,那你在队列里的位置就是第几个。
第二步:把你前面的和你后面的分成两坨,第一坨和第二坨分别排队,排好之后分别接到你前面和你后面,就ok,至于这两坨怎么排得,那就是递归(重复第一步和第二步)完成了,每一坨都按照你这个套路来就完事了

c语言代码

看看如何用代码实现:难点来了
一次快排

 int Partition(SqList &L,int low,int high)
 { //交换L中子表L.r[low..high]记录,枢轴到位,返回其位置  L.r[0]=L.r[low]; pivotkey=L.r[low].key; //用第一个记录作枢轴,枢轴就是例子中的你,
 //一次while(low<high) //从表的两端交替地向中间扫描扫一次
  {    while(low<high&&L.r[high].key>=pivotkey)--high;//满足条件一直向下走
         L.r[low]=L.r[high]; // 将比枢轴记录小的记录放到到低端low,覆盖低端区
         //接上:此时L.r[low]和L.r[high]一样,L.r[high]会在下一个覆盖中改变
          
           while(low<high&&L.r[low].key<=pivotkey)   ++low;//
           L.r[high]=L.r[low]; // 将比枢轴记录大的记录放到到高端
    } //while
    L.r[low]=L.r[0];   
    return low; // 返回枢轴所在位置 

看图更加明白
在这里插入图片描述
p就是枢轴。这里是交换数据,但代码中我做了些改动,直接覆盖,节省空间。
递归形式的多次快排的算法

void Qsort (sqlist & L,int low, in high){
int pivotloc;
if(low<high)//递归结束判断
{
pivotloc = qsort(L,low,high);
Qsort(L,low,pivotloc-1);
Qsort(L,pivotloc+1,high);
}}

建议好好读读代码,在写写,这样才能掌握牢固

发布了37 篇原创文章 · 获赞 1 · 访问量 656

猜你喜欢

转载自blog.csdn.net/zzuzhaohp/article/details/103446558