zoukankan      html  css  js  c++  java
  • js排序算法基础--归并排序

    归并排序

    归并排序是可以被实际使用的排序算法,其复杂度为O(nlogn)。

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

    由于是分治法,归并排序也是递归的;我们首先定义一个实际被执行的辅助函数。

    // 该函数是将一个数组切分为两个数组
    function mergeSort(array){
        var length = array.length;
        // 当length为1时,说明已经切割为最小数据,递归的结束条件
        if(length == 1){
            return array;
        }
        var mid = Math.floor(length / 2),
            left = array.slice(0,mid),
            right = array.slice(mid,length);
       // merge函数,负责将分割的小数组合并
    return merge(mergeSort(left), mergeSort(right))
    }
    function merge(left, right){
        var result = [],
            il = 0,
            ir = 0;
        // 这里的left 和 right 分被是两个已经排过序的数组
        // 选择两个数组中最小的依次放入结果中,直到一个数组的值完全放进结果集中
        // 直到其中的一个数组全部放到结果集中,结束循环
        while(il < left.length && ir < right.length){
            if(left[il] < right[ir]){
                result.push(left[il++])
            }else{
                result.push(right[ir++])
            }
        }
        //将还没有完全放进去的那个数组,依次放入结果集,因为每个数组一定是已经排好序的
        // 这里的left 与 right 不分先后 因为到这里肯定有一个数组为空,
        while(il < left.length){
            result.push(left[il++])
        }
        while(ir < right.length){
            result.push(right[ir++])
        }
        return result;
    }

    主要流程:

      算法首先将原始数组分割直至只有一个元素的子数组,然后开始归并。归并过程也会完成排序,直至原始数组完全合并并完成排序。

    图示:

  • 相关阅读:
    [BZOJ3160]万径人踪灭
    [BZOJ5212][ZJOI2018]历史
    [BZOJ3563&3569]DZY Loves Chinese
    [HDU4336]Card Collector
    [HDU4652]Dice
    [POJ3683]Priest John's Busiest Day
    ISODateTimeFormat 转换2019-08-15T00:36:49.366456463Z 日期格式
    GoTTY-K8S-Docker 终端
    【php】PHP对redis操作详解
    【tool】VLC播放rtmp协议
  • 原文地址:https://www.cnblogs.com/recode-hyh/p/11234912.html
Copyright © 2011-2022 走看看