排序算法-归并排序

Posted ppxyq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法-归并排序相关的知识,希望对你有一定的参考价值。

归并排序

 概念:归并排序是一种分治算法。其思想是将原始数组切分成较小的数组,直到每个小数组只有一个位置,接着将小数组归并成较大的数组,直到最后只有一个排序完毕的大数组。

 

 

代码实现

 

var mergeSortRec = function (array) {
  var length = array.length;// {1}
  if (length === 1) {// {2}
    return array;
  }
  var mid = Math.floor(length / 2), //{3}首先得找到数组的中间位
    left = array.slice(0, mid),//{4}左边小数组
    right = array.slice(mid, length);//{5}右边小数组
  return merge(mergeSortRec(left), mergeSortRec(right));// {6}调用merge函数,它负责合并和排序小数组来产生大数组,直到回到原始数组并已排序完成
}

var merge = function(left, right) {
  var result = [], //需要声明归并过程要创建的新数组以及用来迭代两个数组(left和right数组)所需的两个变量
    il = 0,
    ir = 0;
  while (il < left.length && ir < right.length) {//迭代两个数组的过程中
    if (left[il] < right[ir]) {// 我们比较来自left数组的项是否比来自right数组的项小。
      result.push(left[il++]);// 将该项从left数组添加至归并结果数组,并递增迭代数组的控制变量
    } else {
      result.push(right[ir++]);// 从right数组添加项并递增相应的迭代数组的控制变量
    }
  }
  while (il < left.length) { // 将left数组所有剩余的项添加到归并数组中
    result.push(left[il++]);
  }
  while (ir < right.length) { // 将right数组所有剩余的项添加到归并数组中
    result.push(right[ir++])
  }
  return result;
}

console.log(mergeSortRec([89,78,9,6765,80,3,6]))

 

举例:[8,7,6,5,4,3,2,1]

mergeSortRec([8,7,6,5,4,3,2,1])
过程如下图,把大数组递归地分成小数组,再通过小数组排好序合并成大数组。

技术分享图片

 

 

 

以上是关于排序算法-归并排序的主要内容,如果未能解决你的问题,请参考以下文章

排序算法之归并排序

排序算法归并排序

Java 归并排序算法

Java 归并排序算法

十大经典排序算法总结(归并排序)

[ 数据结构 -- 手撕排序算法第六篇 ] 归并排序(上)--递归方法实现