两个有序序列的合并-手摇算法
一 手摇算法(原地归并)原理
手摇算法通过三次反转(reverse)交换相邻内存块,实现无需额外空间的合并。步骤如下:
1)反转左块;
2)反转右块;
3)反转合并后的块。
二 算法步骤
以数组 [1,4,7,9,2,5,6,8]为例,合并左块 [1,4,7,9]和右块 [2,5,6,8]。
1 初始状态
左块:[1,4,7,9] 右块:[2,5,6,8]
数组:[1,4,7,9,2,5,6,8]
2 比较 4和 2
4 > 2,找到右块中连续比 4小的元素(仅 2)。
交换左块 [4,7,9]和右块 [2]:
反转左块 → [9,7,4]
反转右块 → [2]
合并反转 → [2,4,7,9]
数组变为:[1,2,4,7,9,5,6,8]
3 比较 7 和 5
7 > 5,找到右块中连续比 7 小的元素(5,6)。
交换左块 [7,9]和右块 [5,6]:
反转左块 → [9,7]
反转右块 → [6,5]
合并反转 → [5,6,7,9]
数组变为:[1,2,4,5,6,7,9,8]
4 比较 9 和 8
9 > 8,交换 [9] 和 [8]:
反转左块