两组数据有序数组合并排序

/**鲁军*/
        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: 一些不必要的操作尽量放在循环外面

posted @ 2013-09-05 09:45  火柴人  Views(497)  Comments(0Edit  收藏  举报