JS实现归并排序

136 阅读1分钟

归并排序其实使用的就是分治思想,想对一组很大的数据进行排序时,可以将这组数据拆分成很多组小数据,直到每个组只有一个元素,接下来就针对这些小组,按照顺序合并。

时间复杂度:O(nlogn)

空间复杂度:O(n)

稳定排序

const mergeSort = arr => {
  //采用自上而下的递归方法
  const len = arr.length;
  if (len < 2) {
    return arr;
  }
  let middle = Math.floor(len / 2),
    left = arr.slice(0, middle),
    right = arr.slice(middle); // 拆分为两个子数组
  return merge(mergeSort(left), mergeSort(right));
};

const merge = (left, right) => {
  const result = [];
  while (left.length && right.length) {
    // 注意: 判断的条件是小于或等于,如果只是小于,那么排序将不稳定.
    if (left[0] <= right[0]) {
      result.push(left.shift());
    } else {
      result.push(right.shift());
    }
  }
  // 左侧小集合有剩余,依次插入到大集合的尾部
  while (left.length) result.push(left.shift());
  // 右侧小集合有剩余,依次插入到大集合的尾部
  while (right.length) result.push(right.shift());
  return result;
};