您的位置:首页 > 其它

基数排序

2017-08-16 15:16 281 查看

基数排序的说明

基数排序是一种用在卡片排序机上的算法。基数排序先按最低有效位进行稳定的排序,再利用排序子算法的稳定性,逐渐对高位进行稳定的排序,依次类推。基数排序必须保证子排序算法的稳定性,伪代码如下:

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章 基数排序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息