Appearance
题目
在内部排序时,若选择了归并排序而没有选择插入排序,则可能的理由是( )。
① 归并排序的程序代码更短
② 归并排序的占用空间更少
③ 归并排序的运行效率更高
错因
A
把"归并排序原地完成"当默认。事实上归并排序需要 O(n) 的辅助数组来合并两个有序段,是典型的**"以空间换时间"算法;而插入排序是真正的原地排序**,只需 O(1) 额外空间。② 的方向被搞反了。
C
把 ① 也当对——"归并听起来更结构化、代码更优雅"。但代码量上:插入排序两层循环 + 一个移动赋值,10 行就写完;归并排序需要"递归拆分 + 合并子过程",代码明显更长。① 错;再叠加 A 的 ② 错,整条选项不成立。
D
判对了 ③(归并 O(n log n) 比插入 O(n²) 更快),但同样误判 ① 为对——"归并代码看起来比插入更整洁所以更短",是直觉而不是事实。一旦动笔写一遍两个算法就会发现归并代码更长。
总解析
逐条比对两个算法的关键指标:
| 指标 | 插入排序 | 归并排序 | 优胜方 |
|---|---|---|---|
| 代码量 | 短(双层循环 + 移动赋值) | 长(递归 + 合并函数) | 插入 |
| 辅助空间 | O(1)(原地) | O(n)(辅助数组) | 插入 |
| 时间复杂度(平均/最坏) | O(n²) | O(n log n) | 归并 |
| 稳定性 | 稳定 | 稳定 | 平 |
| 小规模性能 | 常数小、对小数据快 | 递归开销 | 插入 |
逐条审视题干 3 个理由:
- ① 代码更短 → 反了(归并代码更长)。✗
- ② 占用空间更少 → 反了(归并需 O(n) 辅助数组)。✗
- ③ 运行效率更高 → 对(O(n log n) vs O(n²),n 较大时归并显著占优,正是为什么实际工程中大规模排序选归并)。✓
只有 ③ 成立。
最终答案是 B。
常见混淆点:很多教材会说"归并排序更优"——指的是渐进时间复杂度这一个维度,并不意味着所有指标都更好。算法选型是"权衡"而非"全面胜出",这道题就是在考察这种权衡意识。