归并排序

思想

归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

image-20200324202429989.png

实现

/**
 * 
 * @param {*} array 排序的原始数组
 * @param {*} left 左边有序序列的初始索引
 * @param {*} mid 中间索引
 * @param {*} right 右边索引
 * @param {*} temp 做中转的数组
 */
function merge(array, left, mid, right, temp) {
  let i = left //左边有序序列的第一个索引
  let j = mid + 1//右边有序序列的第一个索引
  let t = 0 //temp的索引
  //1. 先把左右两边有序的数据按照规则填充到temp数组
  //直到左右两边的有序序列, 有一边处理完为止
  while (i <= mid && j <= right) {
    if (array[i] <= array[j]) {
      temp[t] = array[i]
      t++
      i++
    } else {
      temp[t] = array[j]
      t++
      j++
    }
  }
  //2. 把有剩余的一边的数据依次填充到temp后面
  while (i <= mid) {
    temp[t] = array[i]
    t++
    i++
  }
  while (j <= right) {
    temp[t] = array[j]
    t++
    j++
  }
  //3. 把temp数组拷贝给array
  //注意每次拷贝的长度不一定一样
  t = 0
  let tempLeft = left
  while (tempLeft <= right) {
    array[tempLeft] = temp[t]
    t++
    tempLeft++
  }
}
function mergeSort(array, left, right, temp) {//分解
  if (left < right) {
    let mid = Math.floor((left + right) / 2) //中间索引
    mergeSort(array, left, mid, temp)
    mergeSort(array, mid + 1, right, temp)
    //合并
    merge(array, left, mid, right, temp)
  }
}


let array = [8, 4, 5, 7, 1, 3, 6, 2]
let temp = new Array(array.length) //需要额外的空间
mergeSort(array, 0, array.length - 1, temp)
console.log(array);
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容