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

How to implement insertion sort for two arrays in ES6

假设我有两个数组:

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

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

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

[
  90, 86, 72, 64, 64, 64, 56, 44,
  24, 21, 20, 20, 19, 17, 16, 16,
  15, 15, 15, 13, 13,  9,  9,  9,
   7,  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, 64, 86, 20, 64, 56, 72, 16];
let arr2 = [21, 13, 9, 13, 15, 7, 17, 15, 9, 19, 7, 15, 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, 44, 64, 16, 24, 20, 64, 86, 20, 64, 56, 72, 16];
let arr2 = [21, 13, 9, 13, 15, 7, 17, 15, 9, 19, 7, 15, 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, ...arr2].sort((a, 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, ...arr2].sort((a, b) => b - a);resultArray = arr1.concat(arr2).sort(function(a, b) {return b - a}); 花费的时间更长...