UNPKG

lgrthms

Version:

Algorithms and data structures for your JavaScript and TypeScript projects 🧑‍💻

48 lines (47 loc) 1.72 kB
"use strict"; 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++; } }