Appearance
题目
使用二路归并排序对含 n 个元素的数组 M 进行排序时,二路归并操作的功能是( )。
错因
B
把"二路归并的整体算法过程"中的分治划分当成"二路归并操作"本身。归并排序确实包含"对半切分"这一步,但那是 divide 阶段,对应递归切分函数(不涉及比较元素值);merge 才是这道题问的"二路归并操作"——把两个已经有序的子表组合成一个更大的有序表。混淆了 divide 与 merge 的角色。
C
误把递归切分到底的"全部基础态"当成二路归并操作。"切到每段只含 1 个元素"也是 divide 阶段的最终态,仍然没有比较元素,不是合并操作。归并排序的比较和搬运动作只发生在 merge 这一步。
D
把快速排序的 partition 当成二路归并。划分后"一部分均小于另一部分"是快排选定 pivot 后的不变量,与归并完全是不同思想——归并是"先排好局部再拼接",快排是"先粗排两边再各自细排"。
总解析
思路:归并排序 = divide(划分) + conquer(递归排序) + merge(二路归并)。题目专问"二路归并操作"。
二路归并的标准定义:把两个已经有序的子表 A 和 B,逐一比较表头元素,把较小的搬入新表,反复直到搬完,得到一个新的有序表。其复杂度为 ,是归并排序之所以能 的关键步骤。
逐项核对:
- A:与定义完全一致 ✓
- B:描述的是 divide 阶段(对半切)✗
- C:描述的是 divide 阶段递归到底 ✗
- D:描述的是快排 partition ✗
最终答案是 A。