퀵정렬은 중복된 값이 많을수록 느리다는 단점이 있기 때문에
앞에서는 중복된 값이 없다는 가정을 하고 진행했습니다.
이것을 극복할 수 있는 방법이 3-way partitioning 입니다.
앞에서는 pivot 값보다 작은것과 큰 것 두 묶음으로 나누었지만,
여기서는
key 값보다 작은 값,
key 값과 같은 값,
key 값보다 큰 값
이렇게 3가지로 나눕니다.
구현 자체는 어렵지 않습니다.
코드)
void Quick3way(std::vector<int>& v, int low, int high) {
if (low >= high) return;
int lt = low;
int i = low + 1;
int gt = high;
int k = v[low];
std::cout << "Key = " << k << '\n';
while (i <= gt) {
if (v[i] < k) {
std::swap(v[lt], v[i]);
lt++;
i++;
} else if (v[i] > k) {
std::swap(v[gt], v[i]);
gt--;
} else {
i++;
}
}
Print(v, low, high);
Quick3way(v, low, lt - 1);
Quick3way(v, gt + 1, high);
}
key 값을 설정해주고 배열을 하나씩 보며 큰지, 작은지, 같은지 비교하면 됩니다.
'DataStructure > Algorithm' 카테고리의 다른 글
Dynamic Programming (4) | 2024.10.17 |
---|---|
Bucket Sort (버킷 정렬) (0) | 2024.09.23 |
QuickSort (퀵정렬) (0) | 2024.09.16 |
MergeSort (병합 정렬) (2) | 2024.09.15 |
Sequential Search vs Binary Search ( 순차 탐색 vs 이진 탐색) (0) | 2024.09.13 |