lgrthms
Version:
Algorithms and data structures for your JavaScript and TypeScript projects 🧑💻
45 lines (44 loc) • 1.67 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.quickSort = void 0;
const Comparator_1 = require("../../utils/Comparator");
const arrays_1 = require("../../utils/arrays");
// Best: O(nlog(n)) time | O(log(n)) space
// Avg: O(nlog(n)) time | O(log(n)) space
// Worst: O(n^2) time | O(log(n)) space
function quickSort(array, compareFn) {
const comparator = new Comparator_1.Comparator(compareFn);
doQuickSort(array, comparator, 0, array.length - 1);
return array;
}
exports.quickSort = quickSort;
function doQuickSort(array, comparator, startIdx, endIdx) {
if (endIdx <= startIdx) {
return;
}
const pivotIdx = startIdx;
let leftIdx = pivotIdx + 1;
let rightIdx = endIdx;
while (leftIdx <= rightIdx) {
if (comparator.isGreaterThan(array[leftIdx], array[pivotIdx]) && comparator.isLessThan(array[rightIdx], array[leftIdx])) {
(0, arrays_1.swap)(array, leftIdx, rightIdx);
}
if (comparator.isLessThanOrEqual(array[leftIdx], array[pivotIdx])) {
leftIdx++;
}
if (comparator.isGreaterThanOrEqual(array[rightIdx], array[pivotIdx])) {
rightIdx--;
}
}
(0, arrays_1.swap)(array, pivotIdx, rightIdx);
const leftLength = rightIdx - 1 - startIdx;
const rightLength = endIdx - rightIdx + 1;
if (leftLength <= rightLength) {
doQuickSort(array, comparator, startIdx, rightIdx - 1);
doQuickSort(array, comparator, rightIdx + 1, endIdx);
}
else {
doQuickSort(array, comparator, rightIdx + 1, endIdx);
doQuickSort(array, comparator, startIdx, rightIdx - 1);
}
}