“边界之一:绕过模型不算违反下界。计数排序直接把键值当下标使用,时间 $O(n+k)$;基数排序按数位分配,时间 $O(d(n+k))$——对范围在 $[0,n^2)$ 内的整数取基数 $n$…”
形式陈述
固定长度键与 LSD 不变量
设每条记录的键是长度
LSD(最低有效位优先)从最低位到最高位,反复执行稳定的单数位排序。处理完低
若输入有
辅助空间为
MSD 是另一种组织
MSD(最高有效位优先)先按最高位分桶,再在各桶内递归处理下一位。不同桶之间的次序已经确定,因此它依赖的是递归前缀分组,而不是 LSD 的“稳定保留低位”证明。桶内为空、单元素或键已结束时可停止;具体时间、空间和稳定性要按所选实现另算。
直觉
LSD 每一轮都把更重要的一位放到前面,同时靠稳定性保存较低位已经建立的次序。它没有把整个键当作只能两两比较的黑盒,而是读取键的内部数位。速度因此取决于键的表示、位数和每位桶数。
例子与边界
对
- 个位后:
; - 十位后:
; - 百位后:
。
例如最后一轮中,百位为零的
负整数可以通过保序编码处理;二补码固定宽度键的一种做法是在排序编码中翻转最高符号位,再按无符号键排序。浮点表示则还要明确正负零、无穷与 NaN 的目标排序规则,不能仅把原始 bit 当作普通无符号数。
变长字符串需要终止符与前缀先后约定;固定长度 LSD 的公式不自动涵盖字符访问总量。若键或记录跨越多个字,每次取位、搬运和输出的实际成本也要另计。
推论与应用
位宽、轮数与桶空间
若每个键装入一个
最高一组不足
整数排序还有打包、字典和递归分配等路线,基数排序提供其中一条具体基线。固定宽度整数、定长字符串和按字段编码的数据库键都可以使用它,但“固定几轮”只适用于已经固定的键宽,不能替代随规模增长的字长分析。
数据驻留外存时,还要按块传输计费。随机向许多桶写入可能增加 I/O;RAM 中的线性扫描与稳定分配界本身不保证外存最优。
参考资料
- Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest、Clifford Stein,Introduction to Algorithms, 4th ed., MIT Press, 2022,§8.3。
- Donald E. Knuth,The Art of Computer Programming, Vol. 3: Sorting and Searching, 2nd ed., Addison-Wesley, 1998,§5.2.5。
- Robert Sedgewick and Kevin Wayne, Algorithms, §5.1 String Sorts:键索引计数、LSD 与 MSD。