题目:归并排序的单趟推导
[单选题] 53. 设一组初始记录关键字序列为(25,50,15,35,80,85,20,40,36,70),其中含有5个长度为2的有序子序列,则用归并排序的方法对该记录关键字序列进行一趟归并后的结果为( )。
A. 15,25,35,50,20,40,80,85,36,70
B. 15,25,35,50,80,20,85,40,70,36
C. 15,25,35,50,80,20,36,40,70,85
D. 15,25,35,50,80,85,20,36,40,70
题解
归并排序(Merge Sort)的底层逻辑是“不断把相邻的两个有序小组,合并成一个更大的有序小组”。它的分组长度永远遵循翻倍规律:1变2,2变4,4变8……
第一步:看懂题目的“当前进度”
题目中明确指出,现在的进度是已经分好了“5个长度为2的有序子序列”。 我们在纸上把现在的序列按每 2 个数字画个框,划分阵营:
- 第 1 组:
[25, 50] - 第 2 组:
[15, 35] - 第 3 组:
[80, 85] - 第 4 组:
[20, 40] - 第 5 组:
[36, 70]
第二步:执行“下一趟”归并任务
既然现在的长度是 2,那么这一趟的任务就是:相邻的两个小组合并,变成长度为 4 的新小组。在合并时,要保证新小组内部依然是从小到大排好序的。
- 合并操作 1(第1组 + 第2组): 把
[25, 50]和[15, 35]合并。 按大小挑数字排队:挑 15 -> 挑 25 -> 挑 35 -> 剩下 50。 👉 得到新子序列:15, 25, 35, 50 - 合并操作 2(第3组 + 第4组): 把
[80, 85]和[20, 40]合并。 按大小挑数字排队:挑 20 -> 挑 40 -> 剩下 80, 85。 👉 得到新子序列:20, 40, 80, 85 - 处理落单者(第5组): 因为总共有 5 组,前面 4 组刚好两两结对。第 5 组
[36, 70]找不到可以结对的兄弟了。 归并排序的规矩是:如果落单了,这一趟就什么都不做,原样照抄下来等下一轮再说。 👉 得到序列:36, 70
第三步:拼出最终答案
把上面三步得出的序列按顺序连在一起,去掉括号,就是这一趟归并结束后的最终长相: 15, 25, 35, 50, 20, 40, 80, 85, 36, 70
对应修正标点后的选项 A,推导完成!
