def:之前所有的排序演算法中,各元素的次序依賴於它們之間的比較,我們把這類排序演算法稱為比較排序演算法。
8.1.排序演算法的下界
def:決策樹是一棵二叉樹,它可以表示在給定輸入規模情況下,某一特定排序演算法對所有元素的比較操作。即將所有比較後的次序描述為一條到達葉子節點的路徑,而這個路徑唯一,葉子節點的排列也是唯一的,對n個元素的排列有n!種排列,葉子節點的個數也為n!與排列數相同可以一一對應。
ps:書上說決策樹是一棵完全二叉樹,但是給的配圖卻是非完全二叉樹,根絕上下文的描述來看決策樹葉並非是一棵完全二叉樹。
8.2. 計數排序
假設n個輸入元素中的每乙個都是在0到k區間內的乙個整數,其中k為某個整數。對每個輸入元素x,確定小於x的元素的個數,利用這乙個資訊就可以直接把x放到它輸出陣列的位置上。
def counting_sort(a, b, k):
#初始化
c = [0 for i in range(0, k+1)]
#確定每個元素的個數
for j in range(0, len(a)):
c[a[j]] = c[a[j]] + 1
#確定小於某個元素的個數
for i in range(1, k+1):
c[i] = c[i] + c[i-1]
#輸出到對應的位置上,並調整小於該元素的個數
for j in range(len(a)-1, -1, -1):
b[c[a[j]]-1] = a[j]
c[a[j]] = c[a[j]] - 1
時間複雜度為theta(n + k), 當k = o(n)時,我們採取計數排序,執行的時間為theta(n)。
pro:穩定性,具有相同值的元素在輸出陣列中的相對次序與它們在輸入陣列中的相對次序相同。也就是說,對兩個相同的數來說,在輸入陣列中先出現的數,在輸出陣列中也位於前面,這一點在附帶衛星資料時尤其重要。
8.3.基數排序
基數排序即將每個排序物件拆分為d個物件的組合,從低位到高位依次呼叫穩定排序方法對其進行排序,最後得到乙個排序完成的序列。
def stable_sort(a, k, m):
b = a[:]
c = [0 for i in range(0, m+1)]
for j in range(0, len(a)):
c[ord(a[j][k])] = c[ord(a[j][k])] + 1
for i in range(1, m+1):
c[i] = c[i] + c[i-1]
for j in range(len(a)-1, -1, -1):
b[c[ord(a[j][k])]-1] = a[j]
c[ord(a[j][k])] = c[ord(a[j][k])] - 1
print(b)
return b
def radix_sort(a, d):
b = a[:]
for i in range(d-1, -1, -1):
b = stable_sort(b, i, ord('z'))
return b
所呼叫的排序演算法的穩定性是十分重要的,保證完成排序的低位的輸出順序不變。
8.4.桶排序
用隨機變數指示器證明8.2即可求出t(n)
習題解答
第八章 線性時間排序
這章剛開始證明了基於比較的排序的演算法在最壞情況下,都需要做nlgn次比較。由此可以推出合併排序快速排序都是漸進最優的比較排序演算法。線性時間排序 1.計數排序 計數排序假設n個輸入元素中的每乙個都是介於0 k之間的整數,此處k為某個整數。當k o n 時,計數排序的執行時間為o n 計數排序的思想...
第八章 線性時間排序
比較排序 在排序的最終結果中,各元素的次序依賴於太難之間的比較。決策樹 完全二叉樹,某一特定排序演算法對所有元素的比較操作。節點中標註的是序號不是元素值。需要了解輸入陣列中最大值可能是多大。通過對輸入陣列中的元素進行計數來排序。非原地演算法,需要額外的n k個空間。排序是穩定的。最後乙個迴圈從後向前...
第八章 線性時間排序
輸入 0 k.時間複雜度o k n 當k o n 排序時間為 n 不是比較排序,所以脫離了 nlgn 它根據輸入元素的值確定在陣列中的位置.對於n個d位數,每一位有k個取值,從低位到高位依次穩定排序 n k 那麼時間複雜度為 d n k 對於n個d位數,r d,可以在 d r n 2r 時間內排序....