Я реализовал mergesort и quicksort, чтобы сравнить их с родной сортировкой JavaScript. Для quicksort я попытался использовать этот алгоритм: алгоритм просмотра на youtube. Оба алгоритма используют как можно меньше памяти, так как для сортировки слияния передается вспомогательный массив для каждого рекурсивного вызова (чтобы избежать накладных расходов), а для быстрой сортировки - позиции начального и конечного положения. Я использую сортировки для управления большими объемами данных в приложении NodeJs.
Ниже вы можете использовать сортировку mergesort, quicksort и native JavaScript, и вы можете протестировать производительность
Возникает вопрос: почему собственный JavaScript работает медленнее?
В моем случае:
Chrome - merge sort: measure: 1997.920ms; quicksort: measure: 1755.740мс; родной: мера: 4988.105ms
Node: merge sort: measure: 2233.413ms; quicksort: measure: 1876.055ms; native: measure: 6317.118ms
Объединить сортировку
var length = 10000000; // ten millions;
var arr = [];
for (let i = length; i > 0; i--) {
// random array
arr.push(parseInt(Math.random() * 1000000000));
}
var mergeSort = function(array) {
function merge(arr, aux, lo, mid, hi) {
for (var k = lo; k <= hi; k++) {
aux[k] = arr[k];
}
var i = lo;
var j = mid + 1;
for (var k = lo; k <= hi; k++) {
if (i > mid) {
arr[k] = aux[j++];
} else if (j > hi) {
arr[k] = aux[i++];
} else if (aux[i] < aux[j]) {
arr[k] = aux[i++];
} else {
arr[k] = aux[j++];
}
}
}
function sort(array, aux, lo, hi) {
if (hi <= lo) return;
var mid = Math.floor(lo + (hi - lo) / 2);
sort(array, aux, lo, mid);
sort(array, aux, mid + 1, hi);
merge(array, aux, lo, mid, hi);
}
function merge_sort(array) {
var aux = array.slice(0);
sort(array, aux, 0, array.length - 1);
return array;
}
return merge_sort(array);
}
console.time('measure');
mergeSort(arr);
console.timeEnd('measure');
console.log(arr[0], arr[1]);