基数排序
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章 基数排序。
相关文章推荐
- 基数排序---Java实现+C++实现
- 基数排序
- Java排序算法(十一):基数排序 .
- 第六篇:逆向分析之LSD基数排序
- 基数排序算法之Java实现
- C# 插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序
- 排序算法 基数排序
- 基数排序原理及JAVA实现(待续)
- 基数排序 Radix sort
- 基数排序
- 排序算法总结之基数排序 Radix sort
- 基数排序
- 基数排序
- 基数排序_FAFU_1270
- 排序之表排序、基数排序及所有排序算法比较
- 八大排序算法之基数排序
- 项目1.6 基数排序
- 常见排序算法(四)(基数排序、桶排序)
- 第十六周——【项目4 - 英文单词的基数排序】
- 排序算法(四) 基数排序