zoukankan      html  css  js  c++  java
  • 快速排序理论---不含源码

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

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

      复杂度:快速排序的平均运行时间为θ(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。之后的再次进行排序,直到序列有序位置。

  • 相关阅读:
    bzoj 4012: [HNOI2015]开店
    POJ 1054 The Troublesome Frog
    POJ 3171 Cleaning Shifts
    POJ 3411 Paid Roads
    POJ 3045 Cow Acrobats
    POJ 1742 Coins
    POJ 3181 Dollar Dayz
    POJ 3040 Allowance
    POJ 3666 Making the Grade
    洛谷 P3657 [USACO17FEB]Why Did the Cow Cross the Road II P
  • 原文地址:https://www.cnblogs.com/geore/p/5894592.html
Copyright © 2011-2022 走看看