基数排序

基数排序的说明

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

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位数和任意正整数 rb ,如果RADIX-SORT使用的稳定排序算法对数据取值区间是0到k的输入进行排序耗时 Θ(n+k) ,那么它就可以在 Θ((b/r)(n+2r)) 时间内将这些数排好序。
对于任意一个值 rb ,每个关键字可以看做 d=b/r 个r位二进制数。每个数都在0到 2r1 区间的一个整数,这样就可以采用计数排序,其中 k=2r1 。每一轮排序花费时间为 Θ(n+k)=Θ(n+2r) ,计数排序花费的总时间代价为 Θ(d(n+2r))=Θ((b/r)(n+2r))
对于给定的n和b,我们希望选择的r( rb )值可以最小化表达式 (b/r)(n+2r) 。如果 b<lgn ,则对于任何满足 rb 的r,都有 (n+2r)=Θ(n) ,这一结果在渐进意义上是最优的。如果 blgn ,选择 r=lgn 可以得到偏差不过常数系数范围内的最优时间代价。此时,得到的运行时间为 Θ(nb/lgn) 。随着r增大到大于 lgn ,分子中的 2r 比分母中的r增加的更快,因此,此时的时间代价是 Ω(nb/lgn) 。反之,如果将r减小到 lgn 之下,则 b/r 项会变大,而 n+2r 仍保持 Θ(n)
在对于基数排序和快速排序的比较之中,尽管基数排序的循环轮数比快速排序要少,但每一次所耗费的时间长得多,哪一个排序算法更适合依赖于具体实现和底层硬件的特性(快速排序通常能比基数排序更好利用硬件的缓存),以及输入的数据的特征。此外,利用计数排序作为中间排序的基数排序不是原址的,而很多 Θ(nlgn) 的比较排序是原址排序。因此,当主存比较珍贵时,可能会更加倾向于快速排序这样的原址排序。
以上摘自算法导论第三版8.3章 基数排序。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值