: Dual-Pivot QuickSort(이중 피벗 퀵소트)는 전통적인 QuickSort(퀵 정렬)의 변형으로, 이름 그대로 두 개의 피벗(pivot)을 사용하여 배열을 세 부분으로 나누고 재귀적으로 정렬하는 방식이다.
: 이 방식은 Java의 Arrays.sort()에서 기본 정렬 알고리즘으로 채택될 만큼 성능이 뛰어난 것으로 알려져 있다.
기본 아이디어:
정렬 단계:
분할 예시:
초기 배열: [9, 2, 7, 4, 5, 1, 8, 3, 6]
피벗 선택: pivot1 = 2, pivot2 = 7
나누기 결과:
- 작은 그룹: [1]
- 중간 그룹: [4, 5, 3, 6]
- 큰 그룹: [9, 8]
피벗 기준 재배치 후: [1] 2 [4,5,3,6] 7 [9,8]
→ 세 그룹에 대해 재귀 정렬
시간 복잡도
| 경우 | 시간 복잡도 |
|---|---|
| 평균 | O(n log n) |
| 최악 | O(n²) (불균형하게 나눌 경우) |
| 최선 | O(n log n) |
하지만 일반적으로 Dual-Pivot QuickSort는 QuickSort보다 빠르게 동작한다.
이유는:
| 항목 | 내용 |
|---|---|
| 피벗 수 | 2개 |
| 파티션 수 | 3개 |
| 장점 | 실제 성능 향상 (캐시 효율, 더 적은 비교), Java 표준 |
| 단점 | 구현이 복잡함, 최악의 경우 여전히 O(n²) |
배열: [6, 3, 8, 5, 2]
피벗으로 5를 선택한다고 가정:
1. 5보다 작은 값 → [3, 2]
2. 5보다 큰 값 → [6, 8]
⇒ 분할 결과: [3, 2] + 5 + [6. 8]
⇒ 이 과정을 양쪽에 반복하면 정렬 완료
❗ 피벗 선택이 중요한 이유
pivot1 = arr[left]; // 배열의 첫 번째 요소
pivot2 = arr[right]; // 배열의 마지막 요소
if (pivot1 > pivot2) {
swap(pivot1, pivot2); // 항상 pivot1 <= pivot2 되도록 정렬
}
가장 왼쪽과 오른쪽 값을 피벗으로 삼는 것이 일반적