目录
前言
今日看到一个题目:两个有序数组,如何合并成一个有序数组?
想法
很简单的题目,今天简单地聊聊JavaScript中的三种快速实现:
- 使用concat合并后用sort排序;
- 创建大数组,逐个元素赋值;
- 创建空数组,逐个元素添加。
测试方法及代码
测试工具
测试代码
<!DOCTYPE html>
<html>
<body>
<h1>JavaScript 测试</h1>
<p id="demo"></p>
<script>
var arrayLen = 50_0000
var a = [];
var b = [];
for(var i=0;i<arrayLen;i++){
a.push(i*5+1);
b.push(i*5+2);
}
function test(){
var s = "";
var sd = new Date();
{//1、使用concat合并后用sort排序
var d = a.concat(b).sort((a,b)=>a-b);
}
s+=new Date()-sd;
s+=" - ";
var sd = new Date();
{//2、创建大数组,逐个元素赋值
var c=new Array(a.length+b.length);
var i=0,j=0;
while(i<a.length || j<b.length){
c[i+j] = i==a.length?b[j++]:(j==b.length?a[i++]:(a[i]<b[j]?a[i++]:b[j++]));
}
}
s+=new Date()-sd;
s+=" - ";
var sd = new Date();
{//3、创建空数组,逐个元素添加
var e=[];
var i=0,j=0;
while(i<a.length || j<b.length){
e.push(i==a.length?b[j++]:(j==b.length?a[i++]:(a[i]<b[j]?a[i++]:b[j++])));
}
}
s+=new Date()-sd;
return s;
}
document.getElementById("demo").innerHTML += "arrayLen = "+arrayLen+"<br>";
for(var i=0; i<10; i++) document.getElementById("demo").innerHTML += test()+"<br>";
</script>
</body>
</html>
测试结果
FireFox 93.0
| |
Edge 94.0.992.50
| |
Chrome 83.0.4103.97
| |
结论
第一种方法写法最简单,对于数组元素少的情况,用起来还是很不错的,但是数组元素量大的时候就会影响效率了;
第二种和第三种方法在火狐浏览器中运行效率基本无差别,但第二种方法在Edge和Chrome浏览器中执行效率上明显高出第三种方法,所以在数据量大的时候推荐使用第二种方法;