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

/**鲁军*/

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

你可能感兴趣的:(排序)