难度:基础。题目原型为洛谷 T708837(私题,题面自定)。本题的考点是按值域分桶的桶排序模板:值域上限提升到 10^6,桶的大小随之变大,但思路仍是「下标 = 数值、一次展开」。
目标
完成本题后,你应该能够:
- 写出按值域分桶的桶排序模板;
- 判断「值域多大时」计数桶仍是可接受的做法;
- 用
vector正确初始化大数组,避免栈溢出。
前置知识
- 11.5 桶排序:按值域把数据分到若干桶,再依次展开;
- 11.4 计数排序:值域较小时的 O(n + 值域) 排序。
题目
读入 n 个整数(值域 0..10^6),用桶排序(按值域分桶)把它们从小到大输出到一行。
输入格式
- 第一行一个整数
n; - 第二行
n个整数(都在0..10^6之间)。
输出格式
一行 n 个整数,为从小到大排序后的结果,空格分隔。
数据范围
| 项目 | 范围 |
|---|---|
个数 n | 1 ≤ n ≤ 10⁵ |
| 元素值 | 0 ≤ 值 ≤ 10⁶ |
样例
样例输入
input
5
4 2 4 5 1样例输出
output
1 2 4 4 5样例解释
统计各数值出现次数:1:1, 2:1, 4:2, 5:1,按值域顺序展开即得升序结果。
如何验证
先安装 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-16-bucket-sort-template
pnpm lab:score -- labs/chapter-11/exercise/E-11-16-bucket-sort-template标准输出参与判题,调试信息请写入标准错误。
完成清单
思考题
- 值域
0..10^6的桶数组要开多大?为什么建议用vector分配? - 如果值域上限再升到
10^9,桶排序还合适吗?你会换成什么算法?