难度:基础。题目原型为洛谷 P1177【模板】排序。本题的考点是用归并排序实现 O(n log n) 的排序:把数组不断二分到单个元素,再合并两个有序子数组,用分治代替朴素排序。
目标
完成本题后,你应该能够:
- 写出归并排序的递归模板(二分 + 合并);
- 说明归并排序为什么是
O(n log n),且是稳定的; - 处理
n = 10⁵规模、|a[i]| = 10⁹量级的整数输入。
前置知识
- 递归的基本概念;
- 两个有序数组合并成一个有序数组的过程。
题目
读入 n 和 n 个整数,把它们从小到大排序后输出一行。
输入格式
- 第一行一个整数
n; - 第二行
n个整数,表示待排序序列a。
输出格式
一行 n 个整数,从小到大排列,相邻整数用一个空格隔开。
数据范围
| 项目 | 范围 |
|---|---|
序列长度 n | 1 ≤ n ≤ 10⁵ |
| 元素值 | −10⁹ ≤ a[i] ≤ 10⁹ |
样例
样例输入
input
5
4 2 4 5 1样例输出
output
1 2 4 4 5样例解释
原序列 4 2 4 5 1 升序排列后为 1 2 4 4 5,其中 4 出现了两次,两个 4 相邻输出。
如何验证
先安装 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-04-sort-template
pnpm lab:score -- labs/chapter-11/exercise/E-11-04-sort-template标准输出参与判题,调试信息请写入标准错误。
完成清单
思考题
- 归并排序为什么是稳定的?
a[i] <= a[j]中的等号放到哪一侧会影响稳定性吗? - 归并排序需要
O(n)的辅助数组,这个空间能不能省到O(1)?