Appearance
题目
对数据进行排序时,若采用直接插入排序而不采用快速排序,则可能的原因是()。
Ⅰ. 大部分元素已有序
Ⅱ. 待排序元素数量很少
Ⅲ. 要求空间复杂度为
Ⅳ. 要求排序算法是稳定的
错因
A
漏掉 III 和 IV,只看到了"性能向"原因(小规模、近似有序)。其实空间复杂度和稳定性也是常见的选型理由:直接插入排序原地交换、空间 ;快排递归栈平均 、最坏 。直接插入排序稳定,快排不稳定(pivot 交换会跨越相等元素)。
B
只挑了 III、IV(空间和稳定性),漏掉了 I 和 II。但 I 和 II 才是"什么时候选直接插入排序而不是快排"最经典的两条理由:
- I:近似有序时直接插入只需 ,快排在已排序输入下若 pivot 选不好甚至会退化到 ;
- II:元素少(如 ),快排的递归开销和常数都比直接插入大,反而更慢——这也是工业实现里"短数组切换到插入排序"的来源。
C
漏掉 III(空间复杂度)。可能是把" 空间"误以为快排也满足。但快排的递归栈深度 = (平均)或 (最坏),并不是 ;而直接插入排序只用几个临时变量,确实 。这一项是真实区分点。
总解析
思路:把直接插入排序与快速排序在四个维度上做并列对比,看哪些场景下"插入更优"。
| 维度 | 直接插入排序 | 快速排序 | 插入是否占优? |
|---|---|---|---|
| 大部分已有序(I) | 最好 | 若 pivot 取首/尾元素,最坏退化 | 占优 ✓ |
| 元素少(II) | 常数小、几乎无递归开销 | 递归调用开销不可忽略,常数较大 | 占优 ✓ |
| 空间 (III) | 原地, ✓ | 平均 递归栈,最坏 | 占优 ✓ |
| 稳定性(IV) | 稳定(只与前一个相邻元素比较,相等不交换) | 不稳定(pivot 划分会跨越相等元素) | 占优 ✓ |
四种场景下都构成"选直接插入排序而非快排"的合理理由,所以 I、II、III、IV 全部成立。
最终答案是 D(Ⅰ、Ⅱ、Ⅲ、Ⅳ)。