难度:入门。题目原型为洛谷 U244852 插入排序。本题的考点是插入排序的标准模板:把每个新元素插入到前面已排好序的区间,最终得到有序序列。
目标
完成本题后,你应该能够:
- 独立写出插入排序的完整代码(外层循环 + 内层「找位置并右移」);
- 说明插入排序为什么是稳定的,以及最好/最坏情况的时间复杂度;
- 说出插入排序适合什么规模、什么形态的数据。
前置知识
- 10.1 排序的基本概念;
- 数组的下标移动与「边找边右移」的写法。
题目
读入一个整数 n 和 n 个整数,用插入排序把它们从小到大排序,并在一行内输出排序后的序列。
输入格式
- 第一行一个整数
n; - 第二行
n个整数,表示待排序的序列。
输出格式
一行 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 插到 3 前得到 1 3 4 1 5,4 不动,再把第二个 1 插到最前得到 1 1 3 4 5,5 不动,最终为 1 1 3 4 5。
如何验证
先安装 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-03-insertion-sort-template
pnpm lab:score -- labs/chapter-10/exercise/E-10-03-insertion-sort-template标准输出参与判题,调试信息请写入标准错误。
完成清单
思考题
- 插入排序的最坏情况发生在什么输入上?此时做了多少次比较?
- 为什么内层用
a[j] > key时排序是稳定的?改成a[j] >= key会怎样?