算法导论 第八章 线性时间排序

来源:互联网 发布:淘宝开店店铺简介 编辑:程序博客网 时间:2024/05/21 11:26

线性时间排序

之前的几种排序,有一个有趣的性质:在排序的最终结果中,各元素的次序依赖于他们之间的比较。我们把这类算法叫做比较排序。

8.1 排序算法的下界

决策树模型

比较排序可以被抽象成一棵决策树。决策树是一棵完全二叉树,它可以表示在给定输入规模情况下,某一特定排序算法对所有元素的比较操作。

最坏情况的下界

在决策树中,从根结点到任意一个可达叶结点之间最长简单路径的长度,表示的是对应的决策算法中最坏情况下的比较次数。因此,一个比较排序算法中的最坏情况比较次数就等于其决策树的高度。同时,当决策树中每种排列都以可达叶结点的形式出现时,该决策树高度的下界也就是比较排序算法运行时的下界。也就是说,最坏情况下,任何比较排序算法都需要做Ω(nlgn)次比较。

8.2 计数排序

计数排序假设n个输入元素中的每一个都是在0到k区间内的一个整数,其中k为某个整数。
计数排序的基本思想是:对每一个输入元素x,确定小于x的元素个数。利用这一信息,可以直接把x放到它在输出数组中的位置上。例如,如果有17个元素小于x,则x就应该在第18个输出位置上。当有几个元素相同时,这一方案要略作修改。因为不能把它们放在同一输出位置上。
在计数排序算法的代码中,假设输入是一个数组A[1, n]。我们还需要两个数组,B[1..n]存放排序的输出,C[0..k]提供临时存储空间。

COUNTING-SORT(A, B, k)    let C[0..k] be a new array    for i=0 to k        C[i]=0    for j=1 to A.length        C[A[j]]=C[A[j]]+1    //C[i] now contains the number of elements equal to i    for i =1 to k        C[i]=C[i]+C[i-1]    //C[i] now contains the number of elements less than or equal to i    for j=A.length downto 1        B[C[A[j]]]=A[j]        C[A[j]]=C[A[j]]-1

可以看出,在计数排序算法中,A应该是正整数数组,而k是比A中的最大值还要大的一个整数。
计数排序的一个重要性质就是它是稳定的:具有相同值的元素在输出数组中的相同次序与他们在输入数组中的相对次序相同。也就是说,对两个相同的数来说,在输入数组中先出现的数,在输出数组中也位于前面。通常,这种稳定性只有当进行排序的数据还附带卫星数据时才比较重要。计数排序的稳定性很重要的另一个原因是:计数排序经常会被用作基数排序算法的一个子过程。为了使基数排序正确运行,计数排序必须是稳定的。

8.3 基数排序

RADIX-SORT(A, d)    for i=1 to d        use a stable array to sort array A on digit i

基数排序与直观感觉相悖的是:先按最低有效位进行排序。

8.4 桶排序

桶排序假设输入输入服从均匀分布,平均情况下它的时间代价为O(n)。与计数排序类似,因为对输入数据作了某种假设,桶排序的速度也很快。

BUILD-SORT(A)    n=A.length    let B[0..n-1] be a new array    for i=0 to n-1        make B[i] an empty list    for i=1 to n        make A[i] into list B[nA[i]]    for i=0 to n-1        srot list B[i] with insertion sort    concatenate the lists B[0],B[1]..,B[n-1] together in order
0 0