算法导论 第七章 快速排序

    xiaoxiao2021-03-26  15

    快速排序

    快速排序通常是实际应用中最好的选择,因为它的平均性能非常好,它的期望时间复杂度为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)
    转载请注明原文地址: https://ju.6miu.com/read-450202.html

    最新回复(0)