学习首页/排序算法/归并排序交互演示 · JavaScript

排序算法 MERGE SORT

归并排序.

递归拆分区间,再将两个有序区间合并。

时间O(n log n)额外空间O(n)稳定性稳定

原理与执行逻辑

将区间递归拆成两半,分别排序后再合并。合并利用两个子区间各自有序的条件,每次取两边尚未输出元素中的较小值。

执行步骤

  1. 按中点拆分区间,递归至长度不超过 1。
  2. 分别完成左半区间与右半区间排序。
  3. 用两个指针比较两侧元素,将较小者追加到缓冲区;一侧耗尽后追加另一侧剩余元素。
  4. 把缓冲区写回原区间,逐层完成合并。

关键理解

合并前两侧必须各自有序。相等时先取左侧元素可以维持稳定性;辅助缓冲区保存本次合并结果。

简短示例

合并 [2, 5] 与 [1, 4] 时依次取 1、2、4,再追加 5,得到 [1, 2, 4, 5]。

代码与执行动画

STEP 0 / 63
归并排序
function mergeSort(arr, left = 0, right = arr.length - 1) {  if (left >= right) return arr;  const mid = Math.floor((left + right) / 2);  mergeSort(arr, left, mid);  mergeSort(arr, mid + 1, right);  const buffer = [];  let i = left, j = mid + 1;  while (i <= mid && j <= right) {    buffer.push(arr[i] <= arr[j] ? arr[i++] : arr[j++]);  }  while (i <= mid) buffer.push(arr[i++]);  while (j <= right) buffer.push(arr[j++]);  for (let k = 0; k < buffer.length; k++) arr[left + k] = buffer[k];  return arr;}
15 行 · 0 个片段标记

高亮对应当前步骤;源码对传入数组进行原地排序。

数组状态

升序 · 8 个元素
比较 0实际交换 0数组写入 0当前区间 —
待排序当前操作已就位

下标显示在底部;柱体随元素移动,等值元素也保留独立身份。

0

准备排序

点击下一步或自动播放,观察数组从左到右升序排列的过程。

调整待排序数组

使用相同数据切换算法,观察比较与交换过程。

2 至 12 个整数,范围 1 至 99;逗号或空格分隔。

算法要点

归并排序的执行规则

合并时使用辅助缓冲区;相等时先取左侧元素,保留相等元素的原有顺序。

交换次数仅统计两个不同位置的交换;可输入重复值。

对应题目与扩展练习

观察执行过程后,按题目约束调整输入、返回值与实现。链接打开官方题目页面。