第二部分 排序和顺序统计量
第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