算法設計與分析課程複習筆記3——線性時間的排序法
線性時間的排序法
排序法回顧
插入排序:
易於實現,適合小規模輸入(一般小於50個元素),對近似排序好的輸入效果好
最壞情況:O(n2)
合併排序:
分治:分割、遞歸處理、線性時間合併
最壞情況:O(nlgn)
上述算法的共同點:基於元素之間的兩兩比較
通過比較獲得輸入元素之間的相對順序,比較操作有:
< , ≤ , = , ≥, or >
(在最壞情況,基於比較思想的排序必須要做Ω(nlgn)次比較)
決策樹模型(Decision Tree Model)
- 表示基於比較排序算法的所有可能比較情況
- 忽略了其他操作,比如控制,數據轉移等操作
- 只考慮比較
- 三個基本元素
n!種排列對應同數目的葉節點
example:123,132,213,231,312,321共六種排列
決策樹模型中必須出現與之對應的6個葉節點
最壞情況:從根到葉最長的路徑
引理:任何樹高爲h的二分樹最多有2h個葉節點
任何基於比較的排序算法:n!≤葉節點數目≤2h
h≥lg(n!)=Ω(nlgn)
計數排序
- 將要排序的元素是0到k之間的整數
- 對於每一個元素x,判斷小於或等於元素x的元素的個數
- 根據計數的情況將元素放入到相應的位置
算法如下:
數組A是輸入,數組B用於存放排序的輸出,數組C提供臨時存儲空間
CountingSort(A,B,k)
讓C[0……k]成爲一個新數組
for i=0 to k Θ(k)
C[i]=0
for j=1 to A.length Θ(n)
C[A[j]]=C[A[j]]+1
//C[i]現在存儲了等於i的元素數目
for i=1 to k Θ(k)
C[i]=C[i]+C[i-1]
//C[i]現在存儲了小於等於i的元素數目
for j=A.length downto i Θ(n)
//不從i到A.length而選擇從A.length到i,這樣保證了穩定性
//即相等的輸入元素的位置先後順序在排列後輸出的先後順序不會改變.
B[C[A[j]]]=A[j] //根據計數的情況將元素放到相應的位置
C[A[j]]=C[A[j]]-1 //取出後減1
相等的輸入元素的位置先後順序在排列後輸出的先後順序不會改變:
時間開銷:Θ(n+k)
基數排序
擴大了可排序的整數範圍
數的基表示:
example:
16536 = 1 ⋅ 104 + 6 ⋅ 103 + 5 ⋅ 102 + 3 ⋅ 101 + 6 ⋅10^0
= 1 ⋅ 25 + 0 ⋅ 24 + 1 ⋅ 23 + 1 ⋅ 22 + 0 ⋅21+ 1 ⋅ 20=45
算法如下:從最後也就是最不重要的那一位開始
RadixSort(A,d)
for i=1 to d
使用穩定的排序方法對第i位排序
如果用計數排序,排一位需要Θ(n+k),排d位則需要Θ(d(n+k))
桶排序
- (輸入是在[0, 1)上一致均勻分佈)
- 將[0, 1) n等分,稱爲空桶
- 將n個輸入分派到這些空桶之中
- 每個桶內排序
- 按順序遍歷每個桶中的元素
算法如下:
BucketSort(A)
n=A.length
讓B[0……n-1]成爲新數組
for i=0 to n-1
讓B[i]成爲一個空列表
for i=1 to n
將A[i]插入到列表B[nA[i]]
for i=0 to n-1
對列表B[i]進行插入排序
按順序遍歷每個桶中的元素並連接B[0]、B[1]、……B[n-1]
輸入滿足一致性隨機分佈,桶排序的平均運行開銷爲O(n)
參考:任課教師邱德紅教授的課件