UNPKG

algopat

Version:

Utility library for implementing common design patterns and algorithms

63 lines 1.84 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.mergeSort = void 0; /** * Performs a merge sort on the given array. * @param array The array to sort. * @param compareFn The function to compare two elements. * @param options The options for the merge sort. * @returns The sorted array. * * @example * const arr = [5, 3, 8, 4, 2]; * const sorted = mergeSort(arr); * console.log(sorted); // [2, 3, 4, 5, 8] * */ const mergeSort = (arr, compareFn = (a, b) => (a < b ? -1 : a > b ? 1 : 0), options) => { const defaultOptions = { mutable: false, ...options, }; const output = defaultOptions.mutable ? arr : [...arr]; if (output.length <= 1) { return output; } const mid = Math.floor(output.length / 2); const left = (0, exports.mergeSort)(output.slice(0, mid), compareFn, defaultOptions); const right = (0, exports.mergeSort)(output.slice(mid), compareFn, defaultOptions); const merged = merge(left, right, compareFn); // Copy back to original array if mutable if (defaultOptions.mutable) { for (let i = 0; i < merged.length; i++) { output[i] = merged[i]; } return output; } return merged; }; exports.mergeSort = mergeSort; const merge = (left, right, compareFn) => { const result = []; let i = 0, j = 0; while (i < left.length && j < right.length) { if (compareFn(left[i], right[j]) <= 0) { result.push(left[i]); i++; } else { result.push(right[j]); j++; } } while (i < left.length) { result.push(left[i]); i++; } while (j < right.length) { result.push(right[j]); j++; } return result; }; //# sourceMappingURL=merge-sort.algorithm.js.map