JavaScript 三种归并排序实现及性能优化经验

作者:极速慢跑

时间:2026-10-28

浏览:420

本文展示了JavaScript中合并两个有序数组的三种不同实现方式,并对比了它们的执行效率。通过测试20万长度数组的归并耗时,总结了concat、循环类型及变量赋值等操作的性能差异,为高并发场景下的代码优化提供参考。

文章目录

第一种归并实现:双指针遍历法

第一种实现方式如下所示。

具体代码实现如下:

/**良哥的*/
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) {\n if (ap < aLen && bp < bLen) {\n if(a[ap] > b[bp]){\n result.push(b[bp++]);\n } else {\n result.push(a[ap++]);\n }\n } else if (!(ap < aLen)){\n while(bp < bLen){\n result.push(b[bp++]);\n }\n } else if (!(bp < bLen)){\n while(ap < aLen){\n result.push(a[ap++]);\n }\n }\n }\n return result;\n}

第二种归并实现:显式索引控制

第二种实现方式如下。

具体代码实现如下:

/**鲁军*/
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){\n for(var y = l; y < bLen; y++){\n list.push(b[y]);\n }\n }else{\n for(var z = x; z < aLen; z++){\n list.push(a[z]);\n }\n }\n\n return list;\n}

性能测试与优化建议

经过测试,两个长度为20W的有序数组进行归并操作,耗时均在15毫秒以下。

基于上述实践,总结以下几点经验(仅在大量数据操作时体现价值,日常开发中代码可读性应作为首要原则):

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

2:for循环比while循环快。

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

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

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章