基数排序的说明
基数排序是一种用在卡片排序机上的算法。基数排序先按最低有效位进行稳定的排序,再利用排序子算法的稳定性,逐渐对高位进行稳定的排序,依次类推。基数排序必须保证子排序算法的稳定性,伪代码如下:
RADIX-SORT(A, d)
for i = 1 to d
use a stable sort to sort array A on digit i
对于基数排序的复杂度分析
首先,给定n个d位数,其中每一个数位有k个可能的取值。如果RADIX-SORT使用的稳定排序方法耗时
Θ(n+k)
,那么它就可以在
Θ(d(n+k))
时间内将这些数排好序。当每位数字在0到k-1区间内,且k不太大的时候,计数排序作为子过程是一个好的选择。对n个d位数来说,每一轮排序耗时
Θ(n+k)
,共有d轮,所以基数排序的总时间是
Θ(d(n+k))
。
给定一个b位数和任意正整数
r≤b
,如果RADIX-SORT使用的稳定排序算法对数据取值区间是0到k的输入进行排序耗时
Θ(n+k)
,那么它就可以在
Θ((b/r)(n+2r))
时间内将这些数排好序。
对于任意一个值
r≤b
,每个关键字可以看做
d=⌈b/r⌉
个r位二进制数。每个数都在0到
2r−1
区间的一个整数,这样就可以采用计数排序,其中
k=2r−1
。每一轮排序花费时间为
Θ(n+k)=Θ(n+2r)
,计数排序花费的总时间代价为
Θ(d(n+2r))=Θ((b/r)(n+2r))
。
对于给定的n和b,我们希望选择的r(
r≤b
)值可以最小化表达式
(b/r)(n+2r)
。如果
b<⌊lgn⌋
,则对于任何满足
r≤b
的r,都有
(n+2r)=Θ(n)
,这一结果在渐进意义上是最优的。如果
b≥⌊lgn⌋
,选择
r=⌊lgn⌋
可以得到偏差不过常数系数范围内的最优时间代价。此时,得到的运行时间为
Θ(nb/lgn)
。随着r增大到大于
⌊lgn⌋
,分子中的
2r
比分母中的r增加的更快,因此,此时的时间代价是
Ω(nb/lgn)
。反之,如果将r减小到
⌊lgn⌋
之下,则
b/r
项会变大,而
n+2r
仍保持
Θ(n)
。
在对于基数排序和快速排序的比较之中,尽管基数排序的循环轮数比快速排序要少,但每一次所耗费的时间长得多,哪一个排序算法更适合依赖于具体实现和底层硬件的特性(快速排序通常能比基数排序更好利用硬件的缓存),以及输入的数据的特征。此外,利用计数排序作为中间排序的基数排序不是原址的,而很多
Θ(nlgn)
的比较排序是原址排序。因此,当主存比较珍贵时,可能会更加倾向于快速排序这样的原址排序。
以上摘自算法导论第三版8.3章 基数排序。