数据结构学习12——快速排序

来源:互联网 发布:python twisted下载 编辑:程序博客网 时间:2024/06/10 00:38

快速排序算法思想:通过一趟排序将待排记录分割成独立的两部分,其中一部分的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

关于对于快速排序的来说,它的基本思路是一分为二,那么如何一分为二,在何处值进行一分为二则是快速排序算法中的核心。

假设我们设一分为二的点为中枢值pivot:

void QSort(SqList *L,int low,int high){if(low<high){pivot=Partition(L,low,high);QSort(L,low,piovot-1);//对低子表进行排序QSort(L,piovt+1,high);//对高子表进行排序}}


上述代码可以发现,假设我们要对{50,10,90,30,70,40,80,60,20}进行排序,在执行完Partition(L,1,9)以后就返回5给pivot,数字5表明50放置在数组下标5的位置。此时计算机就把数组编程了位于50左和右小数组{20,10,40,30}和{70,80,60,90}

然后再递归调用QSort(L,1,5-1),QSort(L,5+1,9);其实就是对{20,10,40,30}和{70,80,60,90}进行同样的Partition操作,直到顺序全部正确为止。


因此接下来就是Partition函数的实现:

int Partition(SqList *L,int low,int high){int pivotkey;pivotkey=L->r[low];while(low<high){while(low<high&&L->r[high]>=pivotkey){high--;}swap(L,low,high);while(low<high&&L->r[low]<=pivotkey){low++;}swap(L,low,high);}



算法实现案列:




运行结果如图所示:


针对上述的实现代码我们来分析:

要完成一个快速排序需要实现哪几个方面:

(1)将原有的一个数组分割成两部分,如何分割?

找到一个枢轴值,一部分要比这个小,另一部分要比这个大。如何找????

这个就在Partition中实现:


(2)分割成两部分以后,如何再进行排序操作??

其实就是递归调用,对低子表递归排序,再对高子表进行递归排序。


问题描述:


快递排序优化:


(1)优化1:其实对快递排序优化的问题主要是对枢轴值的优化:比如对于数组{9,1,5,8,3,7,4,6,2}而言,如果选取第一个值为枢轴值的话,其实就是只交换了9与2,就无法进行下去了。

对于这个枢轴值的瓶颈问题进行优化:

优化方案(三数取中法):即取三个关键字进行排序,将中间数作为枢轴,一般取左端、右端和中间三个数,但是也可以随机选取。



0 0
原创粉丝点击