两组数据有序数组合并排序
/**鲁军*/ 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: 一些不必要的操作尽量放在循环外面