← 返回内容列表

合并过程详解:双指针把两个有序数组合并

分享本文
合并过程详解:双指针把两个有序数组合并

merge 的核心:双指针 i、j 每次取较小者写入结果,相等取左侧保证稳定。

给定两个有序子数组,合并用一个结果数组和双指针完成。下面看一个完整可运行实现。

合并:两个有序子数组 → 一个有序数组(双指针)左 L2456右 R1238ij结果 temp(每次取 L[i]、R[j] 中较小者)12234568k第1步:R[0]=1 比 L[0]=2 小 → temp[0]=1,j→1第2步:L[0]=2 与 R[1]=2 相等 → 取左侧 L(保持相等键原序)第3步:L[0]=2 ≤ R[1]=2 → temp[2]=2,i→1重复到一侧耗尽,再把另一侧整体拷入 temp每步 O(1),共 n 步 → 单次合并 O(n);稳定来自“相等取左侧”

图:merge(L,R) 双指针合并——每次取较小者写入 temp

def merge(left, right):
    out = []; i = j = 0
    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            out.append(left[i]); i += 1
        else:
            out.append(right[j]); j += 1
    out.extend(left[i:]); out.extend(right[j:])
    return out

单次合并 O(n),且“相等取左侧”是稳定性的关键。想验证稳定性,看下一篇。

相关推荐:归并排序为什么稳 · 插入/选择/冒泡排序

评论 (0)

正文划词可点「问萝卜特」——自动发评论并由 AI 回复

加载评论中…

合并过程详解:双指针把两个有序数组合并 | 必学必会