两个有序序列合并算法分析
一 问题背景
合并两个有序序列是常见操作,例如在归并排序中。传统方法需要额外空间,时间复杂度为 O(n)。但若要求原地合并(不占用额外内存),则需借助 手摇算法(或称内存反转或三次反转算法)。
二 手摇算法原理
手摇算法通过三次反转操作,实现数组片段的原地交换。例如将序列 A + B变为 B + A(假设 A 和 B是连续子数组):
1)反转 A → A'
2) 反转 B→ B'
3)反转 A' + B' → B + A
三 时间复杂度三次反转的总操作次数为 O(n)。
四 原地合并的步骤
假设两个有序子数组存储在同一数组中,分别为 arr[0..mid]和 arr[mid+1..end],合并过程如下:
1) 寻找分割点:找到左子数组中第一个大于右子数组首元素的位置 i。
2) 交换片段:将左子数组的 arr[i..mid]与右子数组的 arr[mid+1..j] 交换(使用手摇算法)。
3)递归调整:对新的左右子数组重复上述操作,直到完全有序。
五 时间复杂度