zoukankan      html  css  js  c++  java
  • 两组数据有序数组合并排序

    /**鲁军*/
            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 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(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;
            }

    两个有序数组,合并后重新排序,经测试以上两种算法20W数据测试基本上都维持在14,15毫秒左右~~~

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

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

    2:for循环比while循环快。

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

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

    5: 一些不必要的操作尽量放在循环外面

  • 相关阅读:
    最全的Pycharm debug技巧,「建议收藏」
    2种场景下的Docker配置的jerkins乱码处理
    is_unique 属性检查给定 Series 对象中的基础数据是否唯一
    【吐血整理】Python 常用模块(二):json 模块
    SDL 显示输入法候选框
    八十年代的歌 磊哥吉他谱
    【云服务器】推荐san、feng、yun服务器,目前永久免费!
    1.0Spring的“出生”
    写在之前-最近打算整理下Spring
    杂记-DIY电脑清单
  • 原文地址:https://www.cnblogs.com/AeroJin/p/3302599.html
Copyright © 2011-2022 走看看