难度:进阶。题目原型为洛谷 P9206(私题,题面自定)。本题考察的是希尔排序的标准写法:用 3g+1 增量序列把序列从小到大排好,作为希尔排序的模板题。
目标
完成本题后,你应该能够:
- 手写出「间隔为 g 的插入排序」内层循环;
- 用
3g+1生成增量序列并按从小到大顺序逐层排序; - 理解希尔排序与普通插入排序的区别:把步长 1 替换成可变的 gap。
前置知识
- 10.1 插入排序的基本过程;
- 增量序列(gap)的概念。
题目
给一个长度为 n 的整数序列 a,用希尔排序(增量序列 3g+1)把它从小到大排序,并把结果输出到一行。
输入格式
- 第一行一个整数
n; - 第二行
n个整数,表示序列a。
输出格式
一行 n 个整数,表示从小到大排序后的序列,相邻整数用一个空格分隔。
数据范围
| 项目 | 范围 |
|---|---|
序列长度 n | 1 ≤ n ≤ 10⁵ |
| 元素值 | −10⁹ ≤ a[i] ≤ 10⁹ |
样例
样例输入
input
5
5 1 4 3 2样例输出
output
1 2 3 4 5样例解释
用 3g+1 增量序列(1, 4, …)做希尔排序后,序列变为升序 1 2 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-14-shell-sort-xufu
pnpm lab:score -- labs/chapter-10/exercise/E-10-14-shell-sort-xufu标准输出参与判题,调试信息请写入标准错误。
完成清单
思考题
- 希尔排序的内层循环和普通插入排序几乎一样,唯一区别在哪里?为什么改一个步长就能变快?
- 如果增量序列里包含较大的 gap,先按大 gap 排序有什么意义?