算法导论第三版习题8.3

8.3-1

(1) 首先按最低位字母进行排序得到SEA,TEA,MOB,TAB,DOG,RUG,DIG,BIG,BAR,EAR,COW,ROW,NOW,BOX,FOX;
(2) 然后对次低位字母进行稳定排序得到TAG,BAR,EAR,SER,TEA,DIG,BIG,MOB,DOG,COW,ROW,NOW,BOX,FOX,RUG;
(3) 最后对首位字母进行稳定排序得到BAR,BIG,BOX,COW,DIG,DOG,EAR,FOX,MOB,NOW,ROW,SEA,TAB,TEA。

8.3-2

插入排序,归并排序和快速都是稳定排序,只有堆排序不是稳定的。
对于堆排序,可以修改MAX-HEAPIFY算法的第3到第7行如下:

3 if l <= A.heap-size and A[l] >= A[i]
4   largest = l
5 else largest = i
6 if r <= A.heap-size and A[r] >= A[largest]
7   largest = r

当节点 i 的左右孩子节点中有一个与其相等时,将会造成多一次的交换,额外时间为 Θ(n) ,没有造成额外空间消耗。

8.3-3

我们可以归纳证明对于基数排序,当他进行完第 i 列时,由第1列到第 i 列的关键字构成的数的数组是已排好序的。
(1) 首先,当 i=1 时,我们本来就是对第1行进行排序,所以显然正确;
(2) 然后我们假设当 i=k1 时,由第1列到第 k1 列关键字构成的数的数组是已排好序的,那么当 i=k 时,因为第 i 列是最高位,所以最高位的大小决定了整个数的大小;当第 i 列相等时,由低位决定大小,由底层排序算法稳定,所以保持了其大小顺序,所以原假设正确。
所以当最后 i=d 时,由第1列到第 d 列,也即整个完整的数组已排好序。

8.3-4

将所有的整数作为以n为基的3位的数来调用基数排序,此时 d=3 k=n ,所以该方法的时间复杂度为 Θ(3(n+n))=Θ(n)

8.3-5

最坏的情况下,对于每一位上的排序都要分成 d 位子问题,一共就需要进行 d1i=010i 轮排序,一共需要记录 di=110i 堆卡片。

你可能感兴趣的:(算法)