• 3种归并操作js代码


    /**良哥的*/
    function merge(a, b) {
        var aLen = a.length,
            bLen = b.length,
            maxLen = Math.max(aLen, bLen),
            sumLen = aLen + bLen,
            result = [],
            ap = 0,
            bp = 0;
    
         while (result.length < sumLen) {
            if (ap < aLen && bp < bLen) {
                if(a[ap] > b[bp]){
                    result.push(b[bp++]);
                } else {
                    result.push(a[ap++]);
                }
            } else if (!(ap < aLen)){
                while(bp < bLen){
                    result.push(b[bp++]);
                }
            } else if (!(bp < bLen)){
                while(ap < aLen){
                    result.push(a[ap++]);
                }
            }
        }
        return result;
    }
    /**鲁军*/
    function merge(arr1, arr2){
        
        var i = 0;
        var j = 0;
        var c = 0;
        var k;
        var len1 = arr1.length;
        var len2 = arr2.length;
        var arr = [];
        for(;i<len1 && j<len2;){
            if( arr1[i] > arr2[j]  ){
                arr.push( arr2[j] );
                j++;
            }else{
                arr.push( arr1[i] );
                i++;
            }
            //if(i==len1 || j==len2){
            //    break;
            //}
        }
        
        if(i==len1){
            //arr = arr.concat(arr2.slice(j));
            
            for(k=j; k<len2; k++){
                arr.push( arr2[k] );
            }
        }
        
        if(j==len2){
            //arr = arr.concat(arr1.slice(i))
            for(k=i; k<len1; k++){
                arr.push( arr1[k] );
            }
            
        }
            
        return arr;
    }
    /*金锐的*/
    function merge(a,b){
        var x = 0;
        var l = 0;
        var list = [];
        var aLen = a.length;
        var bLen = b.length;
        
        for(var i = 0; i < bLen; i++){
            for(var j = x; j < aLen; j++){
                if(b[i] < a[j]){
                    list.push(b[i]);
                    l = i;
                    break;
                }else{                
                    list.push(a[j]);
                    x++;
                }
            }     
        }            
    
        if(x == a.length){
            for(var y = l; y < bLen; y++){
                list.push(b[y]);
            }
        }else{
            for(var z = x; z < aLen; z++){
                list.push(a[z]);
            }
        }
        
        return list;
    }

    经过测试2个有序20W长度的数组归并耗时都在15毫秒以下。

    以下有几条经验(在大量操作的时候才能体现,平时不需要做这样的优化。代码可读性还是第一原则)

    1:数组的concat方法比直接for循环push要慢。

    2:for循环比while循环快。

    3:var a = b || 3; //这种操作很消耗时间

    4: break,continue 在已确定不需要再循环时很耗时。

      

  • 相关阅读:
    队列<一>
    二叉树的遍历[先序,中序,后序]
    The method format(String, Object[]) in the type String is not applicable for the arguments
    sqlserver 备份 与 还原
    sqlserver 无法获得数据库独占权
    page.isvalid
    bzoj3994 [SDOI2015]约数个数和
    bzoj4868 [Shoi2017]期末考试
    bzoj1179 [Apio2009]Atm
    bzoj4869 [Shoi2017]相逢是问候
  • 原文地址:https://www.cnblogs.com/idche/p/3302565.html
Copyright © 2020-2023  润新知