728x90
반응형
개요
퀵 정렬(Quick Sort)은 평균적으로 매우 빠른 성능을 자랑하는 비교 기반 정렬 알고리즘으로, 분할 정복(Divide and Conquer) 전략을 사용한다. 주어진 배열에서 기준이 되는 **피벗(Pivot)**을 기준으로 좌우로 나누고, 이를 재귀적으로 정렬해 전체 배열을 정렬하는 방식이다. 내부 정렬 중 가장 널리 사용되며, 실무에서도 많이 활용되는 알고리즘이다.
1. 개념 및 정의
퀵 정렬은 다음과 같은 방식으로 작동한다:
- 피벗(pivot)을 하나 선택한다
- 피벗보다 작은 값은 왼쪽, 큰 값은 오른쪽으로 분할
- 각 파티션(partition)에 대해 재귀적으로 퀵 정렬 수행
- 병합은 따로 필요 없음 (자리 교환으로 해결)
2. 동작 원리
단계 | 설명 |
1 | 피벗을 선택한다 (보통 처음, 마지막, 중간 또는 랜덤) |
2 | 피벗보다 작은 값은 왼쪽, 큰 값은 오른쪽으로 이동 |
3 | 파티션을 기준으로 배열을 나눈다 |
4 | 각 부분 배열에 대해 재귀적으로 퀵 정렬 수행 |
분할 후 병합 과정이 없어 병합 정렬보다 공간 효율이 좋다.
3. 파이썬 구현 예시
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2] # 중간값 피벗
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
# 사용 예시
print(quick_sort([3, 6, 8, 10, 1, 2, 1]))
이 구현은 직관적이지만 리스트 슬라이싱으로 인해 실제 메모리 사용은 증가할 수 있다.
4. 시간 및 공간 복잡도
케이스 | 시간 복잡도 |
최선 | O(n log n) |
평균 | O(n log n) |
최악 (정렬된 배열에 대해) | O(n²) |
- 공간 복잡도: O(log n) (재귀 호출 스택)
피벗 선택을 잘하면 항상 빠르지만, 최악의 경우가 존재한다.
5. 특징 및 장단점
항목 | 설명 |
안정 정렬 여부 | X (동일 값 순서 보장 안됨) |
메모리 효율 | 높음 (병합 불필요) |
재귀 깊이 | O(log n) ~ O(n) |
평균 성능 | 매우 빠름 (정렬 중 최고 수준) |
구현 난이도 | 병합 정렬보다 약간 높음 |
안정 정렬이 필요한 경우에는 병합 정렬이 더 적합하다.
6. 시각적 예시 (예: [5, 3, 8, 4, 2])
- 피벗: 4 → 분할: [3, 2] + [4] + [5, 8]
- [3, 2] → 피벗 2 → [ ] + [2] + [3]
- [5, 8] → 피벗 8 → [5] + [8] + [ ]
- 정렬 결과: [2, 3, 4, 5, 8]
7. 다른 정렬 알고리즘과 비교
알고리즘 | 시간 복잡도 | 공간 복잡도 | 안정성 | 특징 |
퀵 정렬 | O(n log n) (평균) | O(log n) | X | 빠르지만 최악 O(n²) 가능 |
병합 정렬 | O(n log n) | O(n) | O | 안정적이고 일관됨 |
삽입 정렬 | O(n²) | O(1) | O | 정렬된 데이터에 유리 |
선택 정렬 | O(n²) | O(1) | X | 교환 적음 |
퀵 정렬은 '속도'만큼은 최고의 선택이다 (적절한 피벗 선택 시).
8. 활용 사례
분야 | 활용 예시 |
정렬 라이브러리 | Python의 Timsort(퀵+삽입 혼합), C++ std::sort |
알고리즘 문제풀이 | 대량의 수 정렬, 최솟값/최댓값 정렬 후 탐색 |
데이터 처리 | 로그 정렬, 인덱스 생성 등 |
시스템 내부 정렬 | 커널 또는 정렬기 내부 로직 |
현실에서는 퀵 정렬을 기반으로 다양한 하이브리드 정렬이 사용된다.
9. 결론
퀵 정렬은 비교 기반 정렬 중 평균 성능이 가장 우수한 정렬 알고리즘이다. 분할 정복 전략을 기반으로 피벗을 활용하여 재귀적으로 배열을 정렬하며, 빠른 속도와 낮은 메모리 사용으로 인해 실무와 이론에서 모두 널리 사용된다. 피벗 선택과 구현 전략만 잘 설계한다면, 정렬 알고리즘 중 가장 실용적이라 할 수 있다.
728x90
반응형
'Topic' 카테고리의 다른 글
계수 정렬(Counting Sort) 알고리즘 (0) | 2025.03.29 |
---|---|
힙 정렬(Heap Sort) 알고리즘 (0) | 2025.03.29 |
병합 정렬(Merge Sort) 알고리즘 (0) | 2025.03.29 |
삽입 정렬(Insertion Sort) 알고리즘 (0) | 2025.03.29 |
선택 정렬(Selection Sort) 알고리즘 (0) | 2025.03.29 |