퀵 정렬(Quicksort)은 영국의 컴퓨터 과학자 찰스 앤터니 리처드 호어(Charles Antony Richard Hoare)가 1959년에 개발하여 1961년에 발표한 정렬 알고리즘이다. 분할 정복(Divide and Conquer) 전략을 사용하며, 리스트 내의 한 원소를 피벗(Pivot)으로 삼아 나머지 원소들을 피벗보다 작은 그룹과 큰 그룹으로 나누는 과정을 재귀적으로 반복한다. 평균적으로 매우 빠른 성능을 보여 현대 컴퓨팅 환경에서 가장 널리 사용되는 정렬 방식 중 하나이다.

배너 광고

개요

퀵 정렬은 다른 원소와의 비교만으로 정렬을 수행하는 비교 정렬 알고리즘이다. 분할 정복 기법을 사용하여 문제를 더 작은 단위로 쪼개어 해결한다. 대부분의 실질적인 데이터를 정렬할 때 다른 O(nlogn)O(n \log n) 알고리즘보다 빠르게 동작하는 경우가 많아 '퀵(Quick)'이라는 이름이 붙었다. 이는 내부 루프가 메모리 참조의 지역성을 높여 CPU 캐시 히트율이 높게 설계되었기 때문이다. 또한 매 단계에서 적어도 하나의 원소가 자기 자리를 찾게 되므로 이후 정렬할 대상이 줄어드는 특성이 있다.

동작 원리

퀵 정렬은 다음과 같은 단계로 진행된다.

  1. 피벗 선택: 배열에서 하나의 원소를 피벗(Pivot)으로 선택한다.
  2. 분할(Partitioning): 피벗을 기준으로 피벗보다 작은 원소들은 왼쪽으로, 큰 원소들은 오른쪽으로 재배치한다. 이 과정이 끝나면 피벗은 최종적으로 정렬된 위치에 고정된다.
  3. 재귀적 정렬: 피벗을 제외한 왼쪽 부분 배열과 오른쪽 부분 배열에 대해 위 과정을 재귀적으로 반복한다.
  4. 기저 조건: 부분 배열의 크기가 0 또는 1이 되면 정렬이 완료된 것으로 간주하고 재귀를 종료한다.

분할 후 병합 과정이 따로 필요하지 않으며, 제자리에서 데이터 교환을 통해 정렬이 이루어진다.

피벗 선택 전략

피벗 선택은 퀵 정렬의 성능에 결정적인 영향을 미친다. 부적절한 피벗 선택은 분할의 불균형을 초래하여 성능을 저하시킬 수 있다.

  • 첫 번째 또는 마지막 원소: 구현이 간단하지만, 이미 정렬된 배열이나 역순으로 정렬된 배열에서 최악의 성능을 보인다.
  • 무작위 선택(Random Pivot): 배열 내에서 임의의 원소를 피벗으로 선택하여 최악의 경우가 발생할 확률을 통계적으로 낮춘다.
  • 세 값의 중앙값(Median-of-Three): 배열의 첫 번째, 중간, 마지막 원소 중 중앙값을 피벗으로 선택하여 보다 균형 잡힌 분할을 유도한다.

복잡도 분석

시간 복잡도

  • 최선 및 평균: 리스트가 매번 균등하게 절반으로 나뉘는 경우 O(nlogn)O(n \log n)의 비교를 수행한다.
  • 최악: 피벗이 항상 리스트의 최솟값이나 최댓값으로 선택되어 분할이 극도로 불균형하게 일어나는 경우 O(n2)O(n^2)의 비교를 수행한다.

공간 복잡도

퀵 정렬은 별도의 추가 배열을 생성하지 않고 원본 배열 내에서 위치를 바꾸는 제자리 정렬(In-place sort) 방식으로 구현이 가능하다. 다만 재귀 호출로 인해 발생하는 스택 공간이 필요하며, 평균적으로 O(logn)O(\log n), 최악의 경우 O(n)O(n)의 공간을 사용한다.

특징 및 한계

퀵 정렬은 동일한 값을 가진 원소들의 상대적인 순서가 정렬 후에 바뀔 수 있는 **불안정 정렬(Unstable Sort)**에 속한다. 예를 들어 동일한 값 5가 두 개 있을 때, 정렬 전후의 선후 관계가 유지되지 않을 수 있다.

또한 병합 정렬과 달리 리스트를 항상 균등하게 분할하는 것을 보장하지 않으므로 데이터의 분포에 따라 성능 편차가 발생할 수 있다. 그러나 대부분의 실제 데이터 세트에서 매우 효율적으로 동작하며, 참조 지역성(Locality of reference) 원리에 따른 캐시 친화적인 특성 덕분에 범용 정렬 알고리즘으로 널리 채택된다.

참고 자료

5
퀵 정렬퀵 정렬 퀵 정렬(Quicksort)은찰스 앤터니 리처드 호어가 개발한 범용정렬 알고리즘이다. 다른 원소와의 비교만으로 정렬을 수행하는비교 정렬에 속한다. 퀵 정렬은 n개의 데이터를 정렬할 때, 최악의 경우에는 O(n2)번의 비교를 수행하고, 평균적으로 O(n log n)번의 비교를 수행한다. 퀵 정렬의 내부 루프는 대…https://ko.wikipedia.org/wiki/%ED%80%B5_%EC%A0%95%EB%A0%ACQuicksortQuicksort Quicksort is an efficient, general-purpose sorting algorithm. Quicksort was developed by British computer scientist Tony Hoare in 1959 and published in 1961. It is still…https://en.wikipedia.org/wiki/Quicksort퀵 정렬 (Quick Sort) | 알고달레퀵 정렬 (Quick Sort) | 알고달레 # 퀵 정렬 (Quick Sort) 이번 포스팅에서는 가장 유명한 정렬 알고리즘 중 하나인 퀵 정렬(Quick Sort)에 대해서 알아보겠습니다. ## 기본 컨셉 병합 정렬과 마찬가지로 퀵 정렬도 분할 정복 (Divide and Conquer) 기법과 재귀 알고리즘을 이용한…https://www.algodale.com/algorithms/quick-sort/퀵 정렬(Quick Sort) 알고리즘퀵 정렬(Quick Sort) 알고리즘 728x90 ### 개요 퀵 정렬(Quick Sort)은 평균적으로 매우 빠른 성능을 자랑하는 비교 기반 정렬 알고리즘으로, 분할 정복(Divide and Conquer) 전략을 사용한다. 주어진 배열에서 기준이 되는 **피벗(Pivot)**을 기준으로 좌우로 나누고, 이를 재귀적…https://itpe.jackerlab.com/entry/%ED%80%B5-%EC%A0%95%EB%A0%ACQuick-Sort-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98[Algorithm] Quick Sort(퀵 정렬) | speardragon note[Algorithm] Quick Sort(퀵 정렬) | speardragon note 이번시간에는 퀵 정렬에 대해서 배워 보도록 하겠다. 저번 포스팅에서 설명했던 정렬 방식들(버블 정렬, 삽입 정렬, 선택 정렬) 은 가장 기본적인 수준의 정렬 방식들이다. 그러나 이것들은 일반적으로 좋은 성능은 낼 수 없기 때문에 실제로…https://speardragon.github.io/computer%20science/data%20structures%20and%20algorithms%20with%20java/algorithm/sorting/Algorithm-Quick-Sort(%ED%80%B5-%EC%A0%95%EB%A0%AC)/

관련 문서