Topic

퀵 정렬(Quick Sort) 알고리즘

JackerLab 2025. 3. 29. 03:44
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
반응형