前言
非递归实现的归并排序通常被称为'自底向上'(Bottom-Up)版本。与递归版本不同,它不依赖栈回溯拆分,而是直接从长度为 1 的子数组开始,两两合并,步长翻倍(2, 4, 8...),直到覆盖整个数组。
核心思路
将递归逻辑改写为循环结构主要有两种常见方法:使用栈模拟或改为迭代。但在归并排序中,单纯用栈模拟往往只能处理拆分,难以在弹出时找回'合并'的上下文。因此,直接采用循环控制步长是更优解。
核心原理:
- 步长设为 1:将数组视为 N 个长度为 1 的有序子数组。
- 两两合并:相邻的两个长度为 1 的子数组合并成长度为 2 的有序子数组。
- 步长翻倍:将步长设为 2,继续合并成长度为 4 的有序子数组。
- 重复:直到步长超过数组长度,排序完成。
想象面前有一排乱序的扑克牌,先两两整理成有序对,再把这些对整理成有序的四张一组,以此类推。
流程演示
假设数组为 [10, 6, 7, 1, 3, 9, 4, 2],我们逐步观察循环如何控制归并过程。

变量定义
gap: 当前子序列的长度begin1,end1: 左半区间起点和终点begin2,end2: 右半区间起点和终点
第一轮:gap = 1
此时每两个元素为一组进行归并。
- 第一次合并:
[10]和[6]。6 小于 10,交换位置。结果:[6, 10, 7, 1, 3, 9, 4, 2] - 第二次合并:
[7]和[1]。1 小于 7,交换位置。结果:[6, 10, 1, 7, 3, 9, 4, 2] - 第三次合并:
[3]和[9]。已有序,无需变动。 - 第四次合并:
[4]和[2]。2 小于 4,交换位置。
第一轮结束,数组变为两两有序:[6, 10, 1, 7, 3, 9, 2, 4]。
第二轮:gap = 2
此时每四个元素为一组,前两个和后两个归并。
- 第一次归并:左
[6, 10],右[1, 7]。比较后得到[1, 6, 7, 10]。 - 第二次归并:左
[3, 9],右[2, 4]。比较后得到[2, 3, 4, 9]。
第二轮结束,数组变为四四有序:[1, 6, 7, 10, 2, 3, 4, 9]。
第三轮:gap = 4
最后将前后两部分合并。
- :左 ,右 。最终得到完全有序数组 。



