演算法導論第三版習題8 3

2021-07-10 06:05:09 字數 1208 閱讀 9676

(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。

插入排序,歸併排序和快速都是穩定排序,只有堆排序不是穩定的。

對於堆排序,可以修改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),沒有造成額外空間消耗。

我們可以歸納證明對於基數排序,當他進行完第

i 列時,由第1列到第

i列的關鍵字構成的數的陣列是已排好序的。

(1) 首先,當i=

1 時,我們本來就是對第1行進行排序,所以顯然正確;

(2) 然後我們假設當i=

k−1 時,由第1列到第k−

1 列關鍵字構成的數的陣列是已排好序的,那麼當i=

k 時,因為第

i 列是最高位,所以最高位的大小決定了整個數的大小;當第

i列相等時,由低位決定大小,由底層排序演算法穩定,所以保持了其大小順序,所以原假設正確。

所以當最後i=

d 時,由第1列到第

d 列,也即整個完整的陣列已排好序。

將所有的整數作為以n為基的3位的數來呼叫基數排序,此時d=

3,k=

n ,所以該方法的時間複雜度為θ(

3(n+

n))=

θ(n)

。最壞的情況下,對於每一位上的排序都要分成

d 位子問題,一共就需要進行∑d

−1i=

010i輪排序,一共需要記錄∑d

i=110

i 堆卡片。

演算法導論第三版習題5 2

正好僱傭一次說明第一次僱傭的就是所有應聘者中最好的,所以概率為1n 正好僱傭 n 次說明所有應聘者按優秀從低到高依次出現,第一位是最差的,概率為1n 第二位其次,概率為1n 1,所以整體概率為1n 正好僱傭兩次,說明第乙個應聘者不是最好的,概率為n 1n,第二個應聘者是最好的,概率為1n 1,所以概...

演算法導論第三版習題5 3

在進入迴圈前,先將在整個陣列中隨機選擇乙個數至於a 1 即可 permute in place a 1 n a.length 2 swap a 1 with a random 1,n 3 for i 2 to n 4 swap a i with a random i,n 第二步其概率為1n 後面一樣...

演算法導論第三版習題6 3

a a.leng th 9 故從i a.l engt h 2 4開始呼叫max heapify a,i a 4 9 8 故交換a 4 和a 8 得到新的序列a1 b 接下來呼叫max heapify a,3 a 7 3 6 故交換a 3 和a 6 得到a2 c 第三步呼叫max heapify a,...