归并排序代码中为何存在两个相似while循环?最后一个的作用是什么?
归并排序中多个while循环的作用拆解
嘿,这个问题问到点子上了,归并排序的合并步骤里这几个while循环的分工其实特别清晰,我给你拆解下:
那两个近似相同的while循环存在的原因
咱们先回忆归并排序的核心逻辑:要把两个已经排好序的子列表(比如常命名为left和right)合并成一个完整的有序列表。
前面的主while循环负责同时遍历left和right,每次挑出两者当前指针位置里更小的元素放进结果列表——但这个循环只能在两个子列表都还有未遍历元素的时候运行。当其中一个子列表被完全遍历完后,另一个子列表还会剩余一批有序元素,这时候就需要这两个近似的while循环来收尾:
- 第一个循环:如果
left还有剩余元素,直接把这些元素挨个追加到结果列表(因为left本身有序,剩余元素必然比已加入结果的所有元素都大/小,无需再比较) - 第二个循环:如果
right还有剩余元素,同理直接追加剩余元素到结果列表
这两个循环结构近似,是因为它们做的事本质完全一致——都是批量转移剩余的有序元素,只是操作的对象分别是left和right而已。
添加最后一个while循环的缘由
这里的“最后一个while循环”其实是上述两个收尾循环中的一个,它的存在是为了避免遗漏排序元素。
因为两个子列表的长度大概率不相等,主循环结束时必然有一个子列表还有未处理的剩余元素(如果两者都有剩余,主循环就不会停止)。如果没有这个收尾循环,剩余的有序元素就会被丢弃,导致排序结果不完整。举个简单例子:left = [1,3,5],right = [2,4]
主循环会把1、2、3、4都加入结果,但left还剩5,如果没有收尾循环,5就会丢失,最终结果就变成[1,2,3,4],显然不符合排序要求。
另外要补充:这两个收尾循环实际只会执行其中一个——主循环结束时只会有一个子列表有剩余,所以不会出现重复追加的问题。
内容的提问来源于stack exchange,提问作者mathshungry
相关产品推荐
相关产品推荐

