一、概念
任何比较排序在最坏情况下都要用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.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)
e)
step1:同d)step1
step2:用堆排序进行k路合并,见算法导论6.5-8堆排序-K路合并