Merge Sort

归并排序

排序核心时间 O(n log n)空间 O(n)

分治:拆成两半分别排序,再把两个有序数组合并。稳定,时间稳定。

动画

7
2
9
4
1
8
5
3

归并排序:分治拆分,再两两有序合并。

1 / 57

  • 默认

讲解

需要稳定性、外部排序、以及「先分后合」的标准范例。

  1. 01递归把区间对半切开,直到单元素。
  2. 02合并:两个指针扫左右有序段,取较小者写入。
  3. 03剩余元素接到后面。
  4. 04总比较次数稳定在 n log n。

易错点

  • 合并需要额外数组,空间 O(n)。
  • 中点划分要用 mid,合并区间是闭区间还是半开要统一。

代码

function mergeSort(a) {
  if (a.length <= class="text-accent">1) return a;
  const m = a.length >> class="text-accent">1;
  return merge(mergeSort(a.slice(class="text-accent">0, m)), mergeSort(a.slice(m)));
}
function merge(l, r) {
  const out = [];
  let i = class="text-accent">0, j = class="text-accent">0;
  while (i < l.length && j < r.length)
    out.push(l[i] <= r[j] ? l[i++] : r[j++]);
  return out.concat(l.slice(i), r.slice(j));
}

相关课题