algopat
Version:
Utility library for implementing common design patterns and algorithms
63 lines • 1.84 kB
JavaScript
;
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