Lecture 7 Sorting in Linear Time
Sorting in Linear Time2 7.1 Lower bounds for sorting 本節探討排序所耗用的時間複雜度下限。 任何一個以比較為基礎排序的演算法,排序 n 個元 素時至少耗用 Ω(nlogn) 次比較。 是以時間複雜度 至少為 Ω(nlogn) 。 但不使用比較為基礎 的排序演算法,在某些情形 下可在 O(n) 的時間內執行完畢。
Sorting in Linear Time3 Decision-Tree Model 一個以比較為基礎的排序演算法可以按照比較的 順序建出一個 Decision-Tree 。 每一個從 Root 到 Leaf 的路徑都代表一種排序的結 果。 任何一個以比較為基礎排序 n 個元素的演算法,所 對應的 Decision-Tree 高度至少有 Ω(nlogn) 。
Sorting in Linear Time4 Decision-Tree Model a 1 :a 2 a 2 :a 3 a 1 :a 3 a 2 :a 3 > > > > > Eg. (a 1 a 2 a 3 ) (9 2 6)
Sorting in Linear Time5 證明:因為可能有 n! 種可能的排序結果,故對應 的 Decision tree 至少有 n! 個 leaf nodes 。而高度為 h 的二元樹最多有 2 h 個 leaf nodes 。 因此 h log 2 (n!) Θ(nlogn) 。 ( 後者由 Stirling’s approximation 得證: n!>(n/e) n ) Heapsort 與 Mergesort 是 asymptotically optimal 之比 較排序法。 Decision-Tree Model
Sorting in Linear Time6 7.2 Counting Sort Counting Sort ( 記數排序法 ) 不需要藉由比較來做 排序。 必須依賴一些對於待排序集合中元素性質的假設。 ( 如:所有待排序元素均為整數,介於 1 到 k 之間 ) 時間複雜度: O(n+k) 主要的關鍵在於,統計 1 到 k 之間每個數值出現過 幾次,然後想辦法將排序好的數列輸出。
Sorting in Linear Time7 Input: A[1..n], where A[j] ∈ {1,2,…,k} Output:B[1..n], sorted CountingSort(A,B,k) {for i = 0 to k do C[i] 0 for j = 1 to length[A] do C[A[j]] C[A[j]]+1 for i = 1 to k do C[i] C[i]+C[i-1] for j = length[A] downto 1 do B[C[A[j]]] A[j] C[A[j]] C[A[j]]-1 }
Sorting in Linear Time8 3 k= A: C: nd loop 3 rd loop
Sorting in Linear Time9 4 B: C: st iteration 41 B: C: nd iteration 144 B: C: rd iteration 4 th loop …… B: C: th iteration
Sorting in Linear Time Radix Sort Radix Sort( 基數排序法 ) 無需利用元素間的比較排 序。 必須依賴一些對於待排序集合中元素性質的假設。 ( 所有待排序元素均為整數,至多 d 位 )
Sorting in Linear Time11 Radix Sort 關鍵想法:利用記數排序法由低位數排到高位數。 先排個位數 再排十位數 最後排百位數
Sorting in Linear Time12 Radix-Sort(A,d) {for i = 1 to d do use stable sort to sort A on digit i } 此處使用的 stable sort 如果使用 Counting Sort 則每 個 Iteration 只需花 Θ(n+10) 的時間。 因此總共花費 O(d(n+10)) 的時間。 如果 d 是常數,則 Radix Sort 為一個可以在 Linear time 完成的排序演算法。
Sorting in Linear Time Bucket Sort 當元素均勻分布在某個區間時, Bucket sort 平均能 在 O(n) 的時間完成排序。 假定要排序 n 個元素 A[1..n] 均是介於 [0,1] 之間的數 值。 準備 n 個籃子 (bucket) , B[1..n] ,將元素 x 依照 x 所在 的區間放進對應的籃子:即第 個籃子 。
Sorting in Linear Time14 Bucket Sort 元素放進籃子時,使用 Linked list 來儲存,並利用 插入排序法排序。 只要依序將 Lined list 串接起來,即得到已排序的 n 個元素。
Sorting in Linear Time AB 紅色虛線串起的即是最後排序好的 List
Sorting in Linear Time16 時間複雜度分析 假定分到第 i 個籃子的元素個數是 n i 。 最差情形: T(n) =O(n) + =O(n 2 ). 平均情形: T(n) = O(n) + = O(n) + = O(n) 的証明請參考課本