在我的应用程序中,我需要对随机数的大型数组(100,000 到 1,000,000 之间)进行排序。
我一直在使用内置的 array.sort(comparisonFunction)
其中 comparisonFunction 看起来像这样:
function comparisonFunction(a,b) {
return a-b;
}
这工作得很好,但我读过(例如, Native JavaScript sort performing slower than implemented mergesort and quicksort )有更快的选择,特别是如果您的要求满足某些条件:
- 我只需要对数字进行排序(例如,不是对象或字母数字数据)
- 数据是随机的(不可能已经订购了)
- 排序不需要稳定
那么 - 在这种情况下可用的最快(或足够接近)排序算法是什么?
而且,是否有规范的(或至少是相对理想的)JavaScript 实现?
[更新]
因此,快速澄清 - 在链接的问题中,OP 需要稳定的排序。因为我不知道 - 我想知道这是否会改变答案(即, 如果您事先知道您的数据不会被预先排序,并且您不需要稳定排序,那么 也许有一个更快的排序选项可用).
也许答案是“否”,但这就是我问的原因。
[更新 #2]
这是快速排序的一个实现,除非我犯了一个错误 - 轻松击败本机排序功能:
function comparisonFunction(a, b) {
return a - b;
}
function quickSort(arr, leftPos, rightPos, arrLength) {
let initialLeftPos = leftPos;
let initialRightPos = rightPos;
let direction = true;
let pivot = rightPos;
while ((leftPos - rightPos) < 0) {
if (direction) {
if (arr[pivot] < arr[leftPos]) {
quickSort.swap(arr, pivot, leftPos);
pivot = leftPos;
rightPos--;
direction = !direction;
} else
leftPos++;
} else {
if (arr[pivot] <= arr[rightPos]) {
rightPos--;
} else {
quickSort.swap(arr, pivot, rightPos);
leftPos++;
pivot = rightPos;
direction = !direction;
}
}
}
if (pivot - 1 > initialLeftPos) {
quickSort(arr, initialLeftPos, pivot - 1, arrLength);
}
if (pivot + 1 < initialRightPos) {
quickSort(arr, pivot + 1, initialRightPos, arrLength);
}
}
quickSort.swap = (arr, el1, el2) => {
let swapedElem = arr[el1];
arr[el1] = arr[el2];
arr[el2] = swapedElem;
}
var
i,
arr1, arr2,
length;
length = 1000000;
arr1 = [];
arr2 = [];
for (i = 0; i < length; i++) {
arr1.push(Math.random());
arr2.push(Math.random());
}
console.time("nativeSort");
arr1.sort(comparisonFunction);
console.timeEnd("nativeSort");
console.time("quickSort");
quickSort(arr2, 0, length - 1, length);
console.timeEnd("quickSort");
原文由 mattstuehler 发布,翻译遵循 CC BY-SA 4.0 许可协议
有一些排序实现始终击败股票
.sort
(至少是 V8), node-timsort 就是其中之一。例子:以下是我使用的不同浏览器的一些时间(脉轮有人吗?):
因此,FF 引擎与 Chrome/Safari 有很大不同。