《算法導論》第8章 線性時間排序 個人筆記

第8章 線性時間排序

8.1 排序算法的下界

定理:在最壞情況下,任何比較算法都需要做Ω(nlgn) 次比較。
證明:通過一個決策樹模型來分析,對於一顆每個排列都是一個可達的葉節點的決策樹來說,樹的高度可以被確定。考慮一顆高度爲h ,具有l 個可達節點的決策樹,它對應一個對n個元素所做的比較排序。因爲輸入數據的n! 種可能的排列都是葉節點,所以有n!l 。由於在一顆高爲h 的二叉樹中,葉節點的數目不多於2h ,我們得到:

n!l2h

對該式兩邊取對數,有
hlg(n!)=Ω(nlgn)

堆排序和歸併排序都是漸進最優的比較排序算法。

8.2 計數排序

int[] countSort(int A[], int B[], int k, int length){
    int C[] = new int[k + 1];
    for(int i = 0;i < length;i++)
        C[A[i]] += 1;
    for(int i = 1;i <= k;i++)
        C[i] += C[i - 1];
    for(int i = length - 1;i >= 0;i--){
        B[C[A[i]]] = A[i];
        C[A[i]] -= 1;
    }
    return B;
}

總的時間代價是Θ(k+n) ,當k=O(n) 時,我們一般會採用計數排序,這時的運行時間爲Θ(n)

8.3 基數排序

REDIX-SORT(A, d)
for i =i to d
    use a stable sort to sort A on digit i

引力:給定n個d位數,其中每一個數位有k個可能的取值。如果RADIX-SORT使用的穩定排序方法耗時Θ(n+k) ,那麼它就可以在Θ(d(n+k)) 時間內將這些數排好序。

8.4 桶排序

BUCKET-SORT(A)
n = A.length
let B[0..n-1] be a new array
for i = 0 to n-1
    make B[i] an empty list
for i = 1 to n
    insert A[i] into list B[nA[i]]
for i = 0 to n-1
    sort list B[i] with insertion sort
concatnate the lists B[0],B[1],...,B[n-1] together in order

假設ni 是表示桶B[i]中元素個數的隨機變量,因爲插入排序的時間代價是平方階的,所以桶排序的時間代價爲:

T(n)=Θ(n)+i=0n1O(n2i)

桶排序的期望運行時間爲
Θ(n)+nO(21/n)=Θ(n)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章