线性时间排序
2024年12月20日大约 2 分钟
提示
基于比较的排序算法在最坏情况下至少需要比较 次
计数排序
counting_sort(A,n,k)
let B[1:n] and C[0:k] be new arrays
for i = 0 to k
C[i] = 0
for j = 1 to n
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
// Copy A to B, starting from the end of A
for j = n downto 1
B[C[A[j]]] = A[j]
C[A[j]] = C[A[j]] - 1 // to handle duplicate values
return B
提示
- 计数排序假定输入是在小范围内的整数
- 计数排序是稳定排序
- 时间复杂度为
基数排序
radix-sort(A,n,d)
for i = 1 to d
// commonly use counting sort
use a stable sort to sort array A[1:n] on digit i
引理1
给定 n 个 d 位数字,每一位有 k 个取值范围,当使用时间复杂度为 的稳定排序算法时,基数排序的时间复杂度为
引理2
给定 n 个 b 位二进制数字以及正整数 ,当使用时间复杂度为 的稳定排序算法时,基数排序的时间复杂度为
当 时, 表示 ,则选择 可得时间复杂度 是渐进最优的
当 时,选择 ,可得时间复杂度 是渐进最优的
桶排序
bucket_sort(A,n) // 0 ≤ A[i] < 1
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[⌊n·A[i]⌋]
for i = 0 to n - 1
sort list B[i] with insertion sort
concatenate the lists B[0],B[1],...,B[n-1] together in order
return the concatenated listss
提示
- 桶排序假定输入是 内均匀独立分布的数字
- 平均时间复杂度为
令随机变量 表示落在桶 中的数量,则桶排序的运行时间为 , 期望为