JavaScript实现排序算法之归并排序

126 阅读1分钟

归并排序

归并排序也是采用 分而治之 的思想

将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。

思路: merge.png

动画参考:

merge.gif

代码实现

// 归并排序  (递归思想)

let arr = [12, 45, 8, 71, 23, 2, 44]

let mergeSort = arr => {
  if (arr.length === 1) {
    return arr
  }
  let left = arr.slice(0, Math.floor(arr.length / 2))
  let right = arr.slice(Math.floor(arr.length / 2))
  return merge(mergeSort(left), mergeSort(right))
}

// 归并排序的 核心
let merge = (a, b) => {
  // 最终条件 如果该数组是空的就返回另一个数组
  if (a.length === 0) return b
  if (b.length === 0) return a
  // 如果 左数组小于右边的 就让 a[0]连接住出除了它自己的其他数
  return a[0] < b[0] ? [a[0]].concat(merge(a.slice(1), b)) : [b[0]].concat(merge(a, b.slice(1)))
}

console.log(mergeSort(arr));

归并排序的效率

时间复杂度: O(nlogn)