lgrthms
Version:
Algorithms and data structures for your JavaScript and TypeScript projects 🧑💻
48 lines (47 loc) • 1.72 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.mergeSort = void 0;
const Comparator_1 = require("../../utils/Comparator");
// O(nlog(n)) time | O(n) space
function mergeSort(array, compareFn) {
const comparator = new Comparator_1.Comparator(compareFn);
const auxiliaryArray = [...array];
doMergeSort(array, auxiliaryArray, comparator, 0, array.length - 1);
return array;
}
exports.mergeSort = mergeSort;
function doMergeSort(mainArray, auxiliaryArray, comparator, startIdx, endIdx) {
if (startIdx === endIdx) {
return;
}
const middleIdx = Math.floor((startIdx + endIdx) / 2);
doMergeSort(auxiliaryArray, mainArray, comparator, startIdx, middleIdx);
doMergeSort(auxiliaryArray, mainArray, comparator, middleIdx + 1, endIdx);
merge(mainArray, auxiliaryArray, comparator, startIdx, middleIdx, endIdx);
}
function merge(mainArray, auxiliaryArray, comparator, startIdx, middleIdx, endIdx) {
let sortedIdx = startIdx;
let leftIdx = startIdx;
let rightIdx = middleIdx + 1;
while (leftIdx <= middleIdx && rightIdx <= endIdx) {
if (comparator.isLessThan(auxiliaryArray[leftIdx], auxiliaryArray[rightIdx])) {
mainArray[sortedIdx] = auxiliaryArray[leftIdx];
leftIdx++;
}
else {
mainArray[sortedIdx] = auxiliaryArray[rightIdx];
rightIdx++;
}
sortedIdx++;
}
while (leftIdx <= middleIdx) {
mainArray[sortedIdx] = auxiliaryArray[leftIdx];
leftIdx++;
sortedIdx++;
}
while (rightIdx <= endIdx) {
mainArray[sortedIdx] = auxiliaryArray[rightIdx];
rightIdx++;
sortedIdx++;
}
}