Appearance
题目
初始有三个升序序列 (3, 5)、(7, 9)、(6),若按从左至右的次序选择有序序列进行二路归并排序,则关键字之间的总比较次数是( )。
错因
A
只数到第一次合并的比较次数(2 次)就草草加了 1 凑成 3,或者按"最终结果有 5 个元素,要比 3 次大概可以排好"这种凭感觉的估算。漏算了第二次合并里 7 与 6 那一步比较,第二次合并要从头到尾按头部对比,不止 2 次。
B
第一次合并 2 次没问题,但第二次合并漏了 1 次:误以为单元素序列 (6) 与长序列归并时只需要比较一次(6 找到位置就直接插入),没意识到归并算法是"逐位比较两个序列头"——6 需要分别与 3、5、7 顺次比较,直到找到比它小的元素停止。漏算了 5 vs 6 这一步,得 2+2=4。
D
把"剩余元素直接拷贝"那一步也算成了比较次数。第一次合并 (3,5) ⊕ (7,9) 时,5 输出后第一个序列已空,直接拷贝 7、9 不再比较,但选 D 的人多算了 1 次(5 vs 9 或类似),得 3+3=6。归并算法的关键约定是"一旦一侧空了就尾接,不再比较"。
总解析
二路归并合并 (A, B) 的比较次数规则:每一步从 A、B 两个序列头各取一个元素比较一次,败者继续等待、胜者输出;当其中一个序列空了,另一个序列的剩余元素直接尾接拷贝,不再产生比较。
按"从左至右"次序合并三个序列:
第一次合并:
| 步 | 比较 | 胜者 |
|---|---|---|
| 1 | 3 vs 7 | 3 |
| 2 | 5 vs 7 | 5 |
| 3 | 左序列空,尾接 7、9 | — |
合并结果:。比较 2 次。
第二次合并:
| 步 | 比较 | 胜者 |
|---|---|---|
| 1 | 3 vs 6 | 3 |
| 2 | 5 vs 6 | 5 |
| 3 | 7 vs 6 | 6(右序列空) |
| 4 | 尾接 7、9 | — |
合并结果:。比较 3 次。
总比较次数 = 2 + 3 = 5。
最终答案是 C。