DataStructure/Algorithm

3-way QuickSort (3분할 퀵정렬)

S0LL 2024. 9. 16. 12:14

https://sol248.tistory.com/51

 

QuickSort (퀵정렬)

이번에는 퀵정렬에 대해 알아보겠습니다. 퀵정렬은 배열을 두 부분으로 나누고 다시 합치는 과정에서 병합 정렬과 비슷한 면이 있지만,  배열을 절반으로 자르는 병합 정렬과는 달리 퀵정렬

sol248.tistory.com

퀵정렬은 중복된 값이 많을수록 느리다는 단점이 있기 때문에 

앞에서는 중복된 값이 없다는 가정을 하고 진행했습니다.

 

이것을 극복할 수 있는 방법이 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