难度:进阶。题目原型为洛谷 T110310 基数排序的过程(私题,题面自定)。本题的考点是观察 LSD 基数排序的中间过程:每轮只按一个十进制位稳定排序,把每一轮的数组原样打印出来。
目标
完成本题后,你应该能够:
- 说出 LSD 基数排序「个位 → 十位 → 百位」每一轮分别做了什么;
- 解释为什么每一轮都必须稳定(同一当前位的数字保持上轮顺序);
- 复现计数排序的稳定放置(前缀和 + 从后往前)。
前置知识
- 计数排序;
- 数位提取
(x / exp) % 10; - 值域 0~999,恰好按个位、十位、百位共 3 轮处理完。
题目
读入 n 个非负整数(0~999),做 LSD 基数排序。依次输出按个位、十位、百位稳定排序后每一轮的数组,共 3 行;最后一行就是最终有序结果。
输入格式
- 第一行一个整数
n; - 第二行
n个非负整数,以空格分隔。
输出格式
共 3 行,每行 n 个整数、空格分隔,依次为按个位、十位、百位排序后的结果。
数据范围
| 项目 | 范围 |
|---|---|
整数个数 n | 1 ≤ n ≤ 100 |
| 元素值 | 0 ≤ a[i] ≤ 999 |
样例
样例输入
input
6
329 457 657 839 436 720样例输出
output
720 436 457 657 329 839
720 329 436 839 457 657
329 436 457 657 720 839样例解释
- 第 1 行按个位稳定排序:个位为 0 的
720排最前,个位为 9 的329、839保持原顺序排最后; - 第 2 行在上轮基础上按十位稳定排序;
- 第 3 行再按百位稳定排序,即最终有序结果。
如何验证
先安装 Node.js、pnpm 和支持 C++17 的编译器。
powershell
# 已进入本 Lab 目录
make doctor
make run
make run CASE=001-sample
make interactive
make scoreWindows 没有安装 Make 时,在仓库根目录使用等价的 pnpm 入口:
powershell
pnpm lab:run -- labs/chapter-11/exercise/E-11-18-radix-sort-steps
pnpm lab:score -- labs/chapter-11/exercise/E-11-18-radix-sort-steps标准输出参与判题,调试信息请写入标准错误。
完成清单
思考题
- 如果把「从后往前放置」改成「从前往后放置」,哪一组数据会出问题?
- 值域 0~999 为什么恰好 3 轮?如果有个数是 1000 会怎样?
- 观察第 1 行,为什么
329和839(个位同为 9)能保持原来的先后顺序?