第8章 線性時間排序
8.1 排序算法的下界
定理:在最壞情況下,任何比較算法都需要做
證明:通過一個決策樹模型來分析,對於一顆每個排列都是一個可達的葉節點的決策樹來說,樹的高度可以被確定。考慮一顆高度爲
對該式兩邊取對數,有
堆排序和歸併排序都是漸進最優的比較排序算法。
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;
}
總的時間代價是
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使用的穩定排序方法耗時
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
假設
桶排序的期望運行時間爲