분할 정복 알고리즘.
하나의 배열을 pivot을 기준으로 삼아 두 개의 부분으로 분할하여 한쪽은 pivot보다 작은 것들, 다른 쪽은 pivot보다 큰 것들로 정렬한 다음, 각 부분을 또 계속 분할하면서 정렬하는 방법.
Best Case: O(n log n)
Worst Case: O(n^2)
const pivot = (arr, start = 0, end = arr.length - 1) => {
function swap(arr, i, j) {
[arr[i], arr[j]] = [arr[j], arr[i]];
}
let pivot = arr[start]; // 가장 왼쪽을 기준으로 함
let pivotIdx = start;
for (let i = start + 1; i <= end; i++) {
if (pivot > arr[i]) {
pivotIdx++;
swap(arr, pivotIdx, i);
}
}
swap(arr, start, pivotIdx);
return pivotIdx;
};
const quickSort = (arr, left = 0, right = arr.length - 1) => {
if (left < right) {
let pivotIdx = pivot(arr, left, right);
// pivot은 고정이기 때문에 pivot에 -1, +1
quickSort(arr, left, pivotIdx - 1); // left
quickSort(arr, pivotIdx + 1, right); // right
}
return arr;
};