算法导论 第七章 快速排序

来源:互联网 发布:手机贷款软件 编辑:程序博客网 时间:2024/05/21 00:55

快速排序

快速排序通常是实际应用中最好的选择,因为它的平均性能非常好,它的期望时间复杂度为O(nlng), 而且隐含的常数因子非常小。另外,它还是原址排序。

7.1 快速排序的描述

QUICKSORT(A, p, r)    if p<r        q=PARTITION(A, p, r)        QUICKSORT(A, p, q-1)        QUICKSORT(A, q+1, r)PARTITION(A, p, r)    x=A[r]    i=p-1    for j=p to r-1        if A[j]<=x            i=i+1            exchange A[i] with A[j]    exchange A[i+1] with A[r]    return i+1

随着程序的执行,数组被划分为4个(小于主元,大于主元,未划分,主元,可能有空的)区域。对于PARTITION中的第3~6行,for循环的每一轮迭代的开始,每一个区域都满足一定的性质,我们可以将这些性质作为循环不变量:

  • 若p<=k<=i,则A[k]<=x
  • 若i+1<=k<=j=1,则A[k]>x
  • 若k=r,则A[k]=x

对于PARTITION函数,想象一下这个过程,j在不断的向后跑去看各个元素,i则停留在了大于x的元素的前面,当j找到了一个比x小的元素的时候,我们就将这个比x小的元素和i+1位置上比x大的元素进行交换,然后在进行j的下一次迭代的时候,这样确保了1~i的所有元素全部是小于等于x的,而i+1~j的元素全部都是大于x的,j到r的元素还没有进行排序。

7.2 快速排序的性能

快速排序的运行时间依赖于划分是否平衡,二平衡与否又依赖于划分的元素。如果划分是平衡的,则性能于归并排序一样。如果划分是不平衡的,则性能接近于插入排序。

7.3 快速排序的随机化版本

在讨论快速排序的平均情况性能的时候,我们的前提假设是:输入数据的所有排列都是等概率的。但实际工程中这并不总是成立的。有时我们可以引入随机性,从而使得算法对于所有的输入都能获得较好的期望性能。很多人都选择随机化版本的快速排序。
我们通过显式地对输入进行重新排列,使得算法实现随机化。

RANDOMIZED-PARTITIOIN(A, p, r)    i=RANDOM(p, r)    exchange A[r] with A[i]    return PARTITION(A, p, r)RANDOMIZED-QUICKSORT(A, p, r)    if p<r        q=RANDOMIZED-PARTITION(A, p, r)        RANDOMIZED-QUICKSORT(A, p, q-1)        RANDOMIZED-QUICKSORT(A, q+1, r)
0 0
原创粉丝点击