算法描述

归并排序使用分冶思想,分治模式在每一层递归上有三个步骤:

  • 分解:将 n 个元素分成个含 n/2 个元素的子序列
  • 解决:用合并排序法对两个子序列递归的排序
  • 合并:合并两个已排序的子序列已得到排序结果

image.png

动图演示

Merge-sort-example-300px.gif

算法实现

归并排序有两种实现方式,一种是自下而上的迭代,一种是自上而下的递归。我们这里采用递归的方式。
其实明白了思路,就会发现代码很简单,最主要的是明白递归的思想。
分的思想就是一分为二,分为前半部分和后半部分,一次递归分解,直到分为左右均为一个元素。
合并的思想将左右两个有序部分按照顺序合并起来。

  1. const mergeSort = (arr) => {
  2. if (arr.length < 2) return arr
  3. const middle = Math.floor(arr.length / 2)
  4. return merge(mergeSort(arr.slice(0, middle)), mergeSort(arr.slice(middle)))
  5. }
  6. const merge = (left, right) => {
  7. let result = []
  8. while (left.length && right.length) {
  9. if (left[0] <= right[0]) {
  10. result.push(left.shift())
  11. } else {
  12. result.push(right.shift())
  13. }
  14. }
  15. if (left.length) result = [...result, ...left]
  16. if (right.length) result = [...result, ...right]
  17. return result
  18. }