기준값(피벗, Pivot)을 하나 골라 그보다 작은 값은 왼쪽, 큰 값은 오른쪽으로 나눈 뒤, 양쪽을 다시 같은 방식으로 정렬하는 알고리즘. 나누고 나면 피벗은 최종 자리에 놓이므로 합치는 단계가 필요 없다.
function quickSort(arr: number[], lo = 0, hi = arr.length - 1): number[] {
if (lo >= hi) return arr
const pivot = arr[hi]
let p = lo
for (let i = lo; i < hi; i++) {
if (arr[i] < pivot) { [arr[i], arr[p]] = [arr[p], arr[i]]; p++ }
}
;[arr[p], arr[hi]] = [arr[hi], arr[p]] // 피벗을 제자리에
quickSort(arr, lo, p - 1)
quickSort(arr, p + 1, hi)
return arr
}- 평균
O(n log n), 상수가 작고 제자리 정렬(In-Place Sort)이라 실제로 빠른 편이다 - 최악
O(n²): 피벗이 매번 최솟값이나 최댓값이면(이미 정렬된 배열에서 끝 원소를 고르면) 한쪽으로만 쏠린다. 무작위 피벗이나 세 값의 중앙값(Median of Three)으로 피한다 - 추가 메모리는 재귀 스택만큼 평균
O(log n) - 안정 정렬이 아니다
평균은 병합 정렬와 비슷하지만 최악의 경우가 있다는 게 차이다. 분할 정복의 한 예이며, 다른 정렬과의 비교는 정렬 알고리즘.