基数排序

来源:互联网 发布:口袋助理软件 编辑:程序博客网 时间:2024/06/06 12:50

基数排序的说明

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

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章 基数排序。

原创粉丝点击