现在的位置: 首页 > 综合 > 正文

图解排序算法及C语言实现之 —— 快速排序:Quick Sort

2017年08月26日 ⁄ 综合 ⁄ 共 2712字 ⁄ 字号 评论关闭

             上一篇写了冒泡排序,比较简单,也好理解,这章写效率高一些的排序算法---快速排序。

             一、定义及算法原理

             1. 什么叫快速排序?

                     顾名思义,就是速度很快的排序,据说是目前效率最好的排序算法了。它实际是冒泡排序的升级版,也是通过交换来完成的排序,只不过它比较与交换的元素的距离不一定是“相连”的,有时是两端的元素。

             2.基本算法原理
                     先假定一个元素来当“支点”(往往用第一个元素,如果取中间值的元素,效率会更好一点),从最后一个元素开始,来跟这个“支点”比较,如果值小于这个“支点”,则把它的值放到“支点”的位置,它原来的位置则空出来。再从原来“支点”位置开始,往后取每一个元素,跟“支点”值比较,如果值大于“支点”值,则把它放到刚刚空出的位置,一直进行,直到“前、后元素往中间靠拢重叠为止”(这个位置就是“支点”真正的位置)。最后把“支点”前面与后面的元素分别找“支点”并排序,直到结束。其实这是两个递归过程。

              3. 图形表示,第一个元素为“支点”  ,您看明白了吗?                  

                   

                         按算法的基本原理,先设定第一个元素60为“支点”,并把它的值赋给pivotkey, 然后从末端开始,挨个与“支点”值比较,小的放在“支点”位置,就是,

                  先拿20与pivotkey比较,20小于60,所以20放在第一位置。接着从前端开始,挨个比较,大的放到后面空出的位置,20小于60,所以比较下一个数80,80比60大,

                  放到后面刚刚20空出的位置,又从末端开始,重复进行,直到两端下标移动到重叠的位置,这时把pivotkey的值放到这个位置,第一遍排序结束。这个时候已经

                  得出第一个“支点”的位置,并且“支点”前面的值不大于它,后面的值不小于它,把它前面的序列与后面的序列按同样的算法排序,直到结束,便完成排序的算法。

                

                  二、图解排序实现过程:

                  第一遍

                  "支点"下标为0,"支点"保存的值为60,pivot=0, pivotkey=60, prior=0,len=7, rear=len-1, prior不大于rear

                                                                                                                              图一
                

                                 

                                                                                                                             图二

                       

                                     第一遍结束后,新的“支点”位置为第五个元素的位置,并且它前面的元素值都比它小,它后面的元素的值比它大。

                   

                      第二遍

                             第一遍结束后"支点"下标为4,选“支点”下标4前面的数组成数列按第一遍的方法继续排序,"支点"保存的值为20,pivot=0, pivotkey=20, prior=0,len=4, rear=len-1, prior不大于rear

                      

                      这一遍选的“支点”比较特殊,它是这个数列里面的最小值,所以排序后位置没有任何变化(最好的做法是选值为中间的为支点,比如40或者30)。这次排序后“支点”位置依然是0,由于它是第一元素,下一遍只需排序它后面的序列。

  

                第三遍
                         第二遍结束后"支点"下标值为0,选“支点”下标0后面与值为60前的序列组成数列按以上的方法继续排序,"支点"保存的值为40,pivot=1, pivotkey=40, prior=1,len=4, rear=len-1, prior不大于rear

               

                   

                第四遍,排序第一个“支点”值60后面的元素序列,即竖线后面那些数。

                      

             

                    三、程序实现步骤图

                    蓝色及橙色的数据是待排序的元素,紫色圈圈表示排序的步骤,排序一遍并得出新“支点”位置需要5步。

                   

           上图为每一遍排序的各个步骤。

           1.  蓝色箭头,先判断左边下标是否比右边下标小,如果小于或相等,说明元素不存在或者移动到重叠位置。

           2. 青色箭头,设置当前“支点”,如选第一个元素当“支点”。“支点”值赋给一个变量,空出“支点”位置。

           3.  绿色箭头,从末端开始找,如果比“支点”值小,把这个元素插入空出的位置并空出它本身的位置,否则往前移下标,直到找到小的值或者跟前端的下标重叠。
           4.  棕色箭头,从前端开始找,如果比“支点”值大,把这个元素插入空出的位置并空出它本身的位置,否则往后移下标,直到找到大的值或者跟后端的下标重叠。
           5. 黑色箭头,把“支点”值插入到空出的位置,并设置新的“支点”。

           6. 重复上面方法分别找新“支点”前面及后面的元素序列,递归找新“支点”并排好序。

 

           四、C语言代码实现

          

             讲解结束,怎么样,看明白了吗?

 

抱歉!评论已关闭.