难度:入门。题目原型为洛谷 U230342 冒泡排序模板。本题的考点是手写冒泡排序:把「相邻两两比较、大的往后换」这件事写成两层循环,是排序章节最基础的模板。
目标
完成本题后,你应该能够:
- 写对冒泡排序的两层循环:外层「第几趟」、内层「比较到哪为止」;
- 说明为什么每趟结束后当前未排序部分的最大值会「冒泡」到末尾;
- 独立默写冒泡排序模板,并正确输出排序结果。
前置知识
- 10.3 冒泡排序的基本思想:相邻元素两两比较,逆序就交换;
- 数组下标的循环边界。
题目
读入 n 和 n 个整数,用冒泡排序把它们从小到大排序后,按空格分隔输出。
输入格式
- 第一行一个整数
n; - 第二行
n个整数,表示待排序的数组a。
输出格式
一行 n 个整数,从小到大排序后的结果,两两之间用一个空格分隔。
数据范围
| 项目 | 范围 |
|---|---|
数组长度 n | 1 ≤ n ≤ 10⁴ |
| 元素值 | −10⁹ ≤ a[i] ≤ 10⁹ |
样例
样例输入
input
5
3 1 4 1 5样例输出
output
1 1 3 4 5样例解释
序列 3 1 4 1 5 冒泡排序后为 1 1 3 4 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-10/exercise/E-10-10-bubble-sort-template
pnpm lab:score -- labs/chapter-10/exercise/E-10-10-bubble-sort-template标准输出参与判题,调试信息请写入标准错误。
完成清单
思考题
- 为什么内层循环的右边界可以写成
n - 1 - i而不是每次都到n - 1?去掉- i会出错吗? - 如果某趟没有发生任何交换,说明什么?如何利用这一点提前结束排序?