第八章 线性时间排序

来源:互联网 发布:阿里云电子发票 编辑:程序博客网 时间:2024/06/05 01:40

def:之前所有的排序算法中,各元素的次序依赖于它们之间的比较,我们把这类排序算法称为比较排序算法。

8.1.排序算法的下界

def:决策树是一棵二叉树,它可以表示在给定输入规模情况下,某一特定排序算法对所有元素的比较操作。即将所有比较后的次序描述为一条到达叶子节点的路径,而这个路径唯一,叶子节点的排列也是唯一的,对n个元素的排列有n!种排列,叶子节点的个数也为n!与排列数相同可以一一对应。


ps:书上说决策树是一棵完全二叉树,但是给的配图却是非完全二叉树,根绝上下文的描述来看决策树叶并非是一棵完全二叉树。


8.2. 计数排序

假设n个输入元素中的每一个都是在0到k区间内的一个整数,其中k为某个整数。对每个输入元素x,确定小于x的元素的个数,利用这一个信息就可以直接把x放到它输出数组的位置上。

def COUNTING_SORT(A, B, k):    #初始化    C = [0 for i in range(0, k+1)]    #确定每个元素的个数    for j in range(0, len(A)):        C[A[j]] = C[A[j]] + 1    #确定小于某个元素的个数    for i in range(1, k+1):        C[i] = C[i] + C[i-1]    #输出到对应的位置上,并调整小于该元素的个数    for j in range(len(A)-1, -1, -1):        B[C[A[j]]-1] = A[j]        C[A[j]] = C[A[j]] - 1
时间复杂度为theta(n + k),  当k = O(n)时,我们采取计数排序,运行的时间为theta(n)。

pro:稳定性,具有相同值的元素在输出数组中的相对次序与它们在输入数组中的相对次序相同。也就是说,对两个相同的数来说,在输入数组中先出现的数,在输出数组中也位于前面,这一点在附带卫星数据时尤其重要。


8.3.基数排序
基数排序即将每个排序对象拆分为d个对象的组合,从低位到高位依次调用稳定排序方法对其进行排序,最后得到一个排序完成的序列。

def STABLE_SORT(A, k, m):    B = A[:]    C = [0 for i in range(0, m+1)]    for j in range(0, len(A)):        C[ord(A[j][k])] = C[ord(A[j][k])] + 1    for i in range(1, m+1):        C[i] = C[i] + C[i-1]    for j in range(len(A)-1, -1, -1):        B[C[ord(A[j][k])]-1] = A[j]        C[ord(A[j][k])] = C[ord(A[j][k])] - 1        print(B)    return Bdef RADIX_SORT(A, d):    B = A[:]    for i in range(d-1, -1, -1):        B = STABLE_SORT(B, i, ord('Z'))    return B
所调用的排序算法的稳定性是十分重要的,保证完成排序的低位的输出顺序不变。


8.4.桶排序

def INSERTION_SORT(A):     for j in range(1, len(A)):        key = A[j]        i = j - 1        while i >= 0 and A[i] > key:            A[i + 1] = A[i]             i = i - 1        A[i + 1] = keydef BUCKET_SORT(A):    n = len(A)    B = [[] for i in range(n)]    for i in range(0, n):        B[int(n*A[i])].append(A[i])    print(B)    result = []    for i in range(0, n):        INSERTION_SORT(B[i])        result.extend(B[i])    return result

用随机变量指示器证明8.2即可求出T(n)


习题解答

0 0