JavaScript实现归并排序

Posted 十九万里

tags:

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

归并排序思想:
利用归并的思想实现排序,采用经典的分治策略,递归将数组两两分开知道包含一个元素,然后将数组排序合并,最终合并为排序好的数组。

// 归并排序
function mergeSort(array){
    let length = array.length;
    // 如果不是数组或者数组长度小于或者等于0 的,不需要返回
    if(!Array.isArray(ARRAY) || length == 0)return;
    if(length === 1){
        return array;
    }
    let mid = parseInt(length >> 1), //找到中间索引值
    left = array.slice(0,mid);//截取左半截
    right = array.slice(mid,length);//截取右部分
    return merge(mergeSort(left),mergeSort(right)); //递归分解后 选择排序合并
};
function merge(leftArray, rightArray) {
    let result = [],
      leftLength = leftArray.length,
      rightLength = rightArray.length,
      il = 0,
      ir = 0;
      // 左右两个数组的元素依次比较 将较小的元素怒加入到结果数组中,直到其中一共数组的元素全部加入完为止则停止
      while(il < leftLength  && ir < rightArray){
          if(leftArray[il] < rightArray[il]){
              result.push (leftArray[il+++]);
          }else{
              result.push(rightArray[ir++])
          }
      }

      // 如果是左边的数组还有剩余的时候 则把剩余的元素全部加入到数组中。
      while (il < leftLength){
          result.push(leftArray[il++]);
      }
      // 如果是右边数组还有剩余  则把剩余元素全部加入到结果数组中。
      while(ir  < rightLength ){
          result.push(rightArray[ir++]);
      }
      return result;
}

图解:
在网上找到一个图:

看了这个图就比较好理解了,可以看到完全的二叉树,分的阶段是一个递归拆分子序列的过程,每次对数列进行拆分。
归并排序是稳定的排序,也是一种十分高效的排序,能够利用完全二叉树特性一般性能都不会太差,
将整个排序序列看成一个二叉树分解,首先将树分解到每一个子节点,树的每一层都是一个归并排序的过程,每一层归并的时间复杂度为O(n),因为整个树的高度为lgn 所以归并排序的时间复杂度不管在什么情况下都是O(nlogn)
归并排序的平均时间复杂度为 O(nlogn) ,最坏时间复杂度为 O(nlogn) ,空间复杂度为 O(n) ,是稳定排序。

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

归并排序的JavaScript实现

javascript实现归并排序

JavaScript实现归并排序

JavaScript 实现 归并排序快速排序

JavaScript 实现 归并排序快速排序

10种经典排序算法的JavaScript实现方法