(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,...