Skip to content

归并排序

Merge sort

递归排序两半并线性合并的稳定比较排序算法。

条目类型
算法

形式陈述

归并排序把长度 n 的序列分成两个近半子序列,递归排序后在线性时间内合并两个有序结果。其比较时间满足

T(n)=T(n/2)+T(n/2)+Θ(n)=Θ(nlogn).

标准数组实现需要 Θ(n) 辅助空间;链表实现可通过指针重连降低额外元素存储。合并时若相等键优先取左半部分,则算法稳定。最坏比较数与输入排列无关地保持 O(nlogn)

直觉

归并排序把难以整体处理的“排序”分解为两个独立的半区排序和一次稳定线性合并。合并阶段只比较两个有序列表各自尚未取出的最小元素,较小者一旦输出便不可能被另一侧尚未出现的元素越过;这个局部不变式使合并无需回溯,每个元素每层只被处理常数次。每层总合并量为 n,层数约 logn,因此最坏时间稳定在 Θ(nlogn)

递归拆分与稳定双路归并
例子与边界

排序 [4,1,3,2],先得 [1,4][2,3],再线性合并为 [1,2,3,4]。自然归并排序可利用输入中已有的有序段。归并排序不必原地;声称标准数组版本只需 O(1) 额外空间是错误的,虽然存在更复杂的原地归并算法。它的 Θ(nlogn) 比较数达到一般比较排序下界的渐近最优阶。

常见数组实现需要 O(n) 辅助空间;链表上可通过指针重连低成本合并。原地归并存在更复杂算法,不能把“分治”自动等同于 O(logn) 额外空间。对极小子数组切换插入排序常改善常数,但不改变渐近界。

推论与应用

比较排序提供模型,分治法提供结构,递归式给出成本。归并的顺序访问适合外存模型:内存同时缓冲多段并作多路合并,可减少块传输轮数。它也用于稳定排序、逆序对计数与并行流合并。

主存 merge sort 的 O(nlogn) 比较并未描述数据移动层次。外存排序一次并 M/B 路,把成本写成 Sort(N) I/O;Funnel Sort以递归漏斗获得缓存无关排序界;Buffer Tree把批量归并思想用于动态外存更新。并行模型还要分别报告 work 与 depth。相同“归并”机制在四种模型中的成本坐标不同。

参考资料
  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022,Ch. 2, merge sort and recurrence analysis。
  • Donald E. Knuth, The Art of Computer Programming, Vol. 3: Sorting and Searching, 2nd ed., Addison-Wesley, 1998,Vol. 3, §5.2.4, sorting by merging。
关系图谱9 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系