第8章 线性时间排序

一、概念

任何比较排序在最坏情况下都要用O(lgn)次比较不进行排序

计算排序、基数排序、桶排序都是稳定排序

二、代码

三、练习

8.1-1
决策树是一棵二叉树,每个节点表示元素之间一组可能的排序,它与已进行的比较相一致,比较的结果是树的边。
令T是深度为d的二叉树,则T最多有2^T片叶子。具有L片叶子的二叉树深度至少是lgL。
n个元素排序会有n!个不同的大小关系,其决策树必然有n!片树叶,因此决策树的深度至少是lg(n!)

8.2-1因为假设待排序数据的范围中[0,k],所以B被初始化为-1

8.2-3
不稳定
8.2-4
COUNTING-SORT(A, B, k)中步骤L1-L4求出C,ans = C[b] - C[a-1], C[-1]=0

8.3-1
8.3-2
稳定排序有:插入排序,合并排序
方法:为每一个元素加入一个最初位置的属性,但两个元素的value一样大时,比较position,这样不会有相同的两个元素
额外空间:O(4n)
8.3-3
把整数转换为n进制再排序,见算法导论8.3-4
8.3-4
最坏情况下需要d遍

8.4-1
8.4-2
最坏情况是O(n^2)
修改:使用最坏情况下时间为O(nlgn)的算法来处理桶的插入操作
8.4-3
E(X^2)=3/2
E^2(X)=1/2不知道怎么算
8.4-4
假设分为n个桶
BUCKET-SORT(A)
1    n <- length[A]
2    for i <- 1 to n
3    do insert A[i] to list B[n*(A[i].x^2 + A[i].y^2)]
4    for i <- 0 to n-1
5        do sort list B[i] with insertion sort
6    concatenate the lists B[0], B[1], ……,B[n-1] together in order
8.4-5

8-2
计数排序:时间O(k+n),稳定,空间O(k+n)
基数排序:时间O(d*(k+n)),稳定,无额外空间
桶排序:时间O(n),稳定,空间O(n)
a)计数排序、基数排序、桶排序
b)基数排序
c)基数排序
d)基数排序
e)不稳定


8-3
a)先用桶排序(答案里面是计数排序)方法按数字位数排序O(n),再用基数排序的方法分别对每个桶中的元素排序O(n)
b)递归使用计数排序,先依据第一个字母进行排序,首字相同的放在同一组(我觉得更像是桶排序,再对每一组分别使用计数排序的方法比较第二个字母
见到有人用字典树,也是可以的

8-4
a)最原始的比较方法,所有的红水壶与所有的蓝水壶依次比较
c)算法类似于快排,由于不是同种颜色的水壶之间比较,所以采用交叉比较
step1:从红色水壶中随机选择一个
step2:以红色水壶为主元对蓝色水壶进行划分
step3:划分的结果是两个数组,并得到与红色水壶相同大小的蓝色水壶
step4:以这个蓝色水壶为主元,对红色水壶进行划分
step5:用step1到step4的过程不断迭代
 
8-5
a)1排序是完全排序
b)1,3,2,4,5,7,6,8,9,10
d)
step1:分别把1, 1+k, 1+2k, 1+3k,……;2, 2+k, 2+2k, 2+3k,……;……当作是单独的集合
step2:对每个集合进行排序时间为O(nlg(n/k))
e)
step1:同d)step1
step2:用堆排序进行k路合并,见算法导论6.5-8堆排序-K路合并
原文地址:https://www.cnblogs.com/windmissing/p/2559798.html