/**良哥的*/ 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 在已確定不需要再迴圈時很耗時。