| 版权声明:本文为博主原创文章,未经博主允许不得转载。
快速排序的基本的思想是选择一个中轴值,然后将待排序列根据中轴值的大小分成两部分,一部分比关键字小,放在关键字的左边,一部分比关键字大,放在关键字的右边;然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序的序列。
复杂度:快速排序的平均运行时间为θ(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。之后的再次进行排序,直到序列有序位置。