如何在ES6中为两个数组实现插入排序

问题描述

假设我有两个数组:

arr1-[90,44,64,16,24,20,86,56,72,16]

arr2-[21,13,9,15,7,17,19,9]

我想对两个数组实现插入排序并接收排序后的结果数组:

[
  90,21,7
]

我知道我可以通过以下方式间接实现:

resultArray = arr1.concat(arr2).sort(function(a,b) {return b - a});

但这并不是性能方面的最佳解决方案。

对于在ES6中如何实现上述假设,我将不胜感激。

解决方法

您可以分别对数组进行排序,然后合并它们:

const sarr1 = arr1.sort((a,b) => b - a);
const sarr2 = arr2.sort((a,b) => b - a);
const tot = [];
let arr1i = 0;
let arr2i = 0;
while (arr1i < sarr1.length && arr2i < sarr2.length) {
    if (sarr1[arr1i] >= sarr2[arr2i]) {
        tot.push(sarr1[arr1i]);
        arr1i++;
    } else {
        tot.push(sarr2[arr2i]);
        arr2i++;
    }
}
while (arr1i < sarr1.length) {
    tot.push(sarr1[arr1i ++]);
}
while (arr2i < sarr2.length) {
    tot.push(sarr2[arr2i ++]);
}
// tot now contains the fully sorted array
,

使用传播运算符进行连接,然后使用箭头函数进行排序:

let arr1 = [90,44,64,16,24,20,86,56,72,16];
let arr2 = [21,13,9,15,7,17,19,9];

let resultArray = [...arr1,...arr2].sort((a,b) => b - a);

console.log("arr1:");
console.log("["+arr1.join(",")+"]");
console.log("arr2:");
console.log("["+arr2.join(",")+"]");
console.log("resultArray:");
console.log("["+resultArray.join(",")+"]");
.as-console-wrapper { max-height: 100% !important; top: 0; }

测试更大的数组:

let arr1 = [90,9];

for(let i=0; i<10; i++) {
  arr1 = arr1.concat(arr1);
  arr2 = arr2.concat(arr2);
};

let start = null;
let resultArray = null;

start=new Date();
resultArray = [...arr1,b) => b - a);
console.log("First resultArray took " + (Date.now() - start) + "ms");

start = null;
resultArray = null;
start=new Date();
resultArray = arr1.concat(arr2).sort(function(a,b) {return b - a});
console.log("Second resultArray took " + (Date.now() - start) + "ms");
.as-console-wrapper { max-height: 100% !important; top: 0; }

好像let resultArray = [...arr1,b) => b - a);花费的时间比resultArray = arr1.concat(arr2).sort(function(a,b) {return b - a});花费的时间...