快速排序理论---不含源码

|   版权声明:本文为博主原创文章,未经博主允许不得转载。

 

  快速排序的基本的思想是选择一个中轴值,然后将待排序列根据中轴值的大小分成两部分,一部分比关键字小,放在关键字的左边,一部分比关键字大,放在关键字的右边;然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序的序列。

  复杂度:快速排序的平均运行时间为θ(nlogn)。

  快速排序原理图:

                     

 

  原理:首先,选择一个序列中的节点作为基准,以此基准的数值作为大小比较,然后设置两个变量i,j记录当前的位置下标,同时赋初值 i = 0,j = n-1; j下标从当前序列的位置向左扫描,与基准值急性比较,越过大于基准值的节点(j--),当遇到小于基准值的节点时,扫描停止,交换i和j位置对应的值。如果j和i交换之后,在将 i下标从当前位置向右扫描,同样与基准值进行比较,越过小于基准值的节点。当遇到大于基准值的节点时,扫描停止,交换i和j位置对应的值。然后在从j的当前位置向左扫描重复上述步骤, 然后,继续扫描,直至 i 与 j 相遇为止。扫描和交换的过程结束。这是 i 左边的记录的关键字值都小于基准值,右边的记录的关键字值都不小于基准值。字面上理解有点模糊,下面通过表格详细的演示一下快速排序的过程。

  设待排序列为:49  38  65  97  76 13  27  49 

  第一步:初始关键字,这里选择第一个数49,作为基准值。i = 0,j = 7

49 38 65 97 76 13 27 49

  第二步:49 = 49,不需交换位置。 j--, 下一步比较 27 和 49。i = 0, j = 7

49 38 65 97 76 13 27 49

  第三步:27 < 49,左向扫描,交换两个数的位置。 i++, 下一步比较 38 和 49。i=0,j=6

27 38 65 97 76 13 49 49 

  第四步:38 < 49, 右向扫描,小于基准值,不需交换位置。 i++,下一步比较 65 和 49。i=1,j=6

27 38 65 97 76 13 49 49

  第五步:65 > 49, 右向扫描, 大于基准值,交换位置。 j--, 下一步比较 13 和 49。i=2,j=6

27 38 49 97 76 13 65 49

   第六步:13 < 49, 左向扫描,小于基准值,交换位置。i++,下一步比较 97 和 49。i=2,j=5

27 38 13 97 76 49 65 49

  第七步:97 > 49, 右向扫描, 大于基准值, 交换位置。 j--, 下一步比较 49 和 76。i = 3,j = 5

27 38 13 49 76 97 65 49

  第八步:49 < 76,左向扫描, 大于基准值, 位置不需交换。 j--。i = 3,j = 4 

27 38 13 49 76 97 65 49

   第九步:此时 i = j = 3.第一趟排序结束。i=3,j=3

27 38 13 49 76 97 65 49

                                     

  第一趟排序的结果为:27,38,13,49,76,97,65,49。之后的再次进行排序,直到序列有序位置。

 

posted @ 2016-09-22 20:07  Geore  阅读(214)  评论(0编辑  收藏  举报