정렬 알고리즘은 컴퓨터과학에서 가장 기본적이면서도 중요한 주제 중 하나입니다. 그중에서도 퀵정렬(Quick Sort)은 평균적으로 매우 빠른 성능을 보여 실제로 자주 사용되는 정렬 알고리즘입니다. 이번 글에서는 퀵정렬의 개념, 동작 원리, 시간복잡도, 장단점, 그리고 자바스크립트 구현까지 모두 살펴보겠습니다.
퀵정렬은 분할 정복(Divide and Conquer) 방법을 사용하는 정렬 알고리즘입니다.
간단히 말하면:
퀵정렬은 제자리 정렬(in-place sort)이 가능하지만, 구현 방식에 따라 추가 배열을 사용하는 경우도 있습니다.
예를 들어 [3, 6, 2, 7, 5]를 정렬한다고 해봅시다.
기준 값 선택: 5를 pivot으로 선택
분할(partition):
[3, 2] (5보다 작은 값)[5][6, 7] (5보다 큰 값)왼쪽 재귀 호출: [3, 2] → pivot = 2 → [2], [3]
오른쪽 재귀 호출: [6, 7] → pivot = 7 → [6], [7]
합치기: [2, 3, 5, 6, 7]
이 과정을 통해 원래 배열이 정렬됩니다.
퀵정렬은 선택한 pivot에 따라 성능이 달라집니다.
| 경우 | 시간복잡도 | 설명 |
|---|---|---|
| 평균 | O(n log n) | pivot이 적절하게 분할될 때 |
| 최악 | O(n²) | pivot이 매번 최솟값이나 최댓값일 때 |
| 최선 | O(n log n) | pivot이 항상 중앙값일 때 |
공간복잡도는 재귀 호출 때문에 O(log n)입니다(제자리 정렬 기준).
function quickSort(arr) {
if (arr.length <= 1) return arr; // 더 이상 나눌 수 없으면 반환
const pivot = arr[arr.length - 1]; // 마지막 원소를 pivot으로 선택
const left = [];
const right = [];
for (let i = 0; i < arr.length - 1; i++) {
if (arr[i] < pivot) left.push(arr[i]);
else right.push(arr[i]);
}
return [...quickSort(left), pivot, ...quickSort(right)];
}
// 테스트
const nums = [3, 6, 2, 7, 5];
console.log(quickSort(nums)); // [2, 3, 5, 6, 7]
위 코드는 간단하고 직관적이지만, 추가 배열을 사용하기 때문에 제자리 정렬이 아닙니다.
제자리 정렬을 위해서는 배열 내부에서 swap을 이용한 partition 방식이 필요합니다.
퀵정렬은 빠른 평균 성능과 분할 정복 구조 덕분에 실제 현업에서도 자주 사용되는 정렬 알고리즘입니다.
단, pivot 선택에 따라 성능 차이가 크므로, 실무에서는 랜덤 pivot 선택이나 3중 중앙값(Median-of-Three) 방식을 사용해 최악의 경우를 피하는 전략을 씁니다.
퀵정렬을 완전히 이해하면 재귀 구조, 분할 정복, 배열 조작을 모두 학습할 수 있어, 다른 알고리즘 공부에도 큰 도움이 됩니다.