Skip to content

基数排序

Radix sort

按稳定子程序逐位处理固定长度键的非比较排序。

条目类型
算法

形式陈述

基数排序把键分成 d 个数位,每位取 k 种值。LSD 方案从最低位到最高位,反复使用稳定的按单个位排序;归纳可证处理前 i 位后,记录按这 i 位字典序有序。若每轮用计数排序,时间 Θ(d(n+k))。MSD 方案从最高位递归分桶,可提前终止但需要不同稳定性与空间分析。键长度、基数和表示成本必须计入复杂度。

直觉

基数排序逐位处理键,并依赖每一轮稳定排序保留此前低位次序:新处理的高位优先级覆盖旧的低位顺序,相同高位内部却仍保留低位结果,于是逐位累积成完整次序。LSD 版本从最低位到最高位,完成第 i 轮后,元素已按低 i 位有序;MSD 版本从高位递归分桶。它绕过比较下界的代价是键能分解为有限位、每位字母表可高效计数。

基数排序的两轮稳定数位处理
例子与边界

十进制数按个位稳定排,再按十位稳定排,可得到两位数整体有序。若每轮排序不稳定,相同十位的元素会打乱个位次序,LSD 正确性失效。取基数 2b 可一次处理 b 位,但计数数组大小也变为 2b,存在时间—空间权衡。变长字符串需处理终止符和前缀顺序;浮点数与有符号整数要先设计保持数值序的编码。

对三位十进制数 170,45,75,90,802,24,2,66,补前导零后依次按个位、十位、百位做稳定计数排序,最终得到数值次序。若某轮排序不稳定,低位已经建立的顺序会被同高位元素打乱。

负数需分离符号或使用适配的编码;变长字符串的结束符次序要明确定义。位数 d 很大或每位值域 k 过大时,O(d(n+k)) 未必优于比较排序;把机器字运算当常数也隐含字长模型。

推论与应用

计数排序常作为稳定单轮,提供位序列。若 n 个键各占一个 w bit 机器字,并在Word-RAM中用 O(1) 提取一组数位,则选择每轮 b bit 会得到约 w/b 轮、每轮 Θ(n+2b) 的确定性成本。线性或近线性结论必须连同 w,b 与桶空间一起报告。

超越比较的整数排序研究更广的字级分配、打包和递归结构,基数排序只是其中一条基线。固定宽度整数、定长字符串、IP 地址和按字段编码的数据库键都可逐位排序,但编码、稳定性和机器模型必须同时固定。若数据驻留外存,外存排序按块传输计费;一次数位分桶可能产生大量随机写,RAM 上的 Θ(d(n+k)) 并不自动给出最优 I/O。即使数据在内存,基数 2b 的选择也要在轮数、桶数组大小和缓存局部性之间权衡。

参考资料
  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022,Parts I–VI。
  • Donald E. Knuth, The Art of Computer Programming, Vol. 3: Sorting and Searching, 2nd ed., Addison-Wesley, 1998,Chs. 5–6。
关系图谱6 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系