Appearance
题目
对大部分元素已有序的数组进行排序时,直接插入排序比简单选择排序效率更高,其原因是( )。
Ⅰ. 直接插入排序过程中元素之间的比较次数更少
Ⅱ. 直接插入排序过程中所需要的辅助空间更少
Ⅲ. 直接插入排序过程中元素的移动次数更少
错因
B
只看到了"插入排序对几乎已序数组移动很少",却忽略了 I 才是更显著且严格成立的优势。其实简单选择排序的总移动次数始终是 (最多 次赋值),不一定比插入排序多——而比较次数差距才是决定性的( vs )。
C
错把 II 也算对了。直接插入排序和简单选择排序都是原地排序,辅助空间均为 (插入排序需要一个临时变量存"待插入的元素",选择排序需要一个临时变量做交换),二者没有量级差异,谈不上谁"更少"。
D
对三条命题都没仔细辨析,凭"插入排序更优 → 应该哪哪都更优"的整体印象全选。这种"全收"心态在比较类题目里往往掉坑——408 出题人就喜欢在三条命题里塞一两条似是而非的对比项。
总解析
先把两种排序在"大部分已序"情况下的开销摆出来:
| 指标 | 直接插入排序 | 简单选择排序 |
|---|---|---|
| 比较次数 | (每个元素只需与其前驱比较 次即可定位) | (与初始顺序无关,始终为 ) |
| 移动次数 | (已序部分 移动,少量错位元素需移动若干位) | (每趟扫描后做一次交换,共 次交换 次赋值) |
| 辅助空间 |
逐条分析:
Ⅰ. 比较次数更少。✓
直接插入排序的比较次数与初始有序度强相关:完全有序时只需 次比较;几乎有序时也只比 多一点点,整体是 。 简单选择排序的比较次数与初始顺序完全无关——每趟都要遍历未排序部分找最小值,总比较数固定为 ,是 量级。
差距: vs ,量级差异,决定性。这是直接插入排序在"大部分已序"情况下效率高的根本原因。
Ⅱ. 辅助空间更少。✗
两者都是原地排序,空间复杂度均为 。直接插入排序需要一个"哨兵"或临时变量存放当前待插入的关键字;简单选择排序需要一个临时变量做 swap。一个常数 vs 另一个常数,无论怎么算都不能说"更少"。
Ⅲ. 移动次数更少。✗
简单选择排序的移动次数与输入顺序无关:每趟扫描后做 次交换( 次赋值),共 趟,总移动数固定约为 ,是严格 。 直接插入排序的移动次数依赖具体数据:完全有序时为 ;但"大部分已序"≠"完全已序",错位元素需要向后挪位为新元素让位,错位距离累计也可能达到 甚至更高。
更严格地说:在"大部分元素已有序"的一般描述下,无法给出"插入排序的总移动次数严格小于选择排序"的结论——存在一些"几乎已序"的输入,让插入排序的移动次数和选择排序在同一量级、甚至更多。所以 Ⅲ 不成立。
汇总:仅 Ⅰ 正确。
最终答案是 A(仅 Ⅰ)。
这道题的"反直觉点"在 Ⅲ:很多人会下意识觉得"插入排序对几乎已序数组移动也少",但选择排序的"每趟只换一次"也很省。比较次数的量级差才是直接插入排序的杀手锏——这是考点的核心。