第二部分 排序和順序統計量
第8章 線性時間排序
2. 計數排序
- 基本思想:對每一個輸入元素x,確定小於x的元素個數,利用這一信息,將x放到它在輸出數組中的位置上。如,有17個元素小於x,則x就應該在第18個輸出位置上。
- 時間複雜度 Θ(n)
- 假設輸入數據都屬於一個小區間內的整數
- 重要性質: 穩定(具有相同值的元素在輸出數組中的相對次序與輸入數組中的相對次序相同)
Counting-Sort(A, B, k)
let C[0..k] be a new array
for i = 0 to k
C[i] = 0
for j = 1 to A.length
C[A[j]] = C[A[j]] + 1
// C[i] now contains the number of elements equal to i.
for i = 1 to k
C[i] = C[i] + C[i-1]
// C[i] now contains the number of elements less than or equal to i.
for j = A.length downto 1
B[C[A[j]]] = A[j]
C[A[j]] = C[A[j]] - 1
3. 基數排序
- 先按最低有效位進行排序
- 具有線性的時間代價
- 不是 原址排序
- 快速排序可以比基數排序更有效地使用硬件的緩存
4. 桶排序
- 假設輸入是由一個隨機過程產生,該過程將元素均勻、獨立地分佈
- 先對每個桶中的數進行排序,然後遍歷每個桶,按照次序把只個桶中的元素列出
- 時間複雜度 Θ(n)
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
concatenate the list B[0], B[1], ... B[n-1] together in order