归并排序算法

归并排序是一种采用分而治之思想的排序算法,它将大问题分解为小问题进行解决。首先将序列分为两半,对每一半分别排序,然后将两个已排序的子序列合并成完全排序的序列。这个过程通过递归实现,当子序列长度为1时结束。归并排序在处理大量数据时,其性能优于冒泡排序。
摘要由CSDN通过智能技术生成

归并排序概念:

归并排序中涉及到一个概念就是分而治之,总序列化成小序列,将小序列排序好,利用排序好的小序列,再归并排序成原来要排序的序列。

所以排序前先要分:

function divide( arr ){
    let len = arr.length;
    if( !len ) return;
    let left = arr.splice(0, Math.floor(len/2) ),
        right = arr;
}

分完之后要合并,我们默认从小到大排序哈,

 function range ( left ,right ){
     let result = [];
     while( left.length && right.length){
         if( left[0] > right[0] ){
             result.push( right.shift() )
         }else{
             result.push( left.shift() )
         }
     }
     while( left.length ){ 
         result.push( left.shift() )
     }
     while( right.length ){
         result.push( right.shift() )
     }
     return result;
 }

然后我们需要将两个方法合并一下,为了保存我们已经排序好的子序列结果,我们在分割方法那儿使用了递归–调用自身和合并方法,最小子序列要为1,所以两个方法最终可以写成:

function rangeSort( arr ){
    if( !arr.length ) return;
    function divide( arr ){
        let len = arr.length;
        if( len < 2 ) return arr;
        let left = arr.splice(0, Math.floor(len/2) ),
            right = arr;
         return range( divide(left),divide(right) )//难点
    }
    function range ( left ,right ){
         let result = [];
         while( left.length && right.length){
             if( left[0] > right[0] ){
                 result.push( right.shift() )
             }else{
                 result.push( left.shift() )
             }
         }
         while( left.length ){ 
             result.push( left.shift() )
         }
         while( right.length ){
             result.push( right.shift() )
         }
         return result;
     }
     return divide( arr );
}

归并排序在要处理的数量级达到某个级别之后(并不是很大),性能摔冒泡排序好几条街

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值