Jun's note

[Algorithm] Quick Sort (퀵정렬) C++ 본문

Computer Science/Algorithm

[Algorithm] Quick Sort (퀵정렬) C++

junning 2022. 1. 3. 23:59
728x90

1. 퀵정렬 정의

임의로 pivot 잡은 후 pivot보다 작은 그룹을 왼쪽. 큰 그룹을 오른쪽으로 분할하여 해결한다. (분할 정복 방법)

  • 분할 정복 방법 (divide-and-conquer) 
    • 큰 문제를 작은 문제 단위로 쪼개면서 해결한다.
    • 문제를 2개의 문제로 분리하는데, 원소개수가 1개가 될 때까지 분리한다. 그 다음 작은 문제에서부터 결과를 모아 원래 문제를 해결한다.
    • 멀리 있는 값들끼리 교환이 일어나므로 불안정한 정렬이다.
  • 퀵정렬은 분할, 정복, 결합 단계로 이뤄진다.
    • 분할(Divide): 피벗을 중심으로 피벗보다 작은 원소는 왼쪽, 큰 원소는 오른쪽으로 분할한다.
    • 정복(Conquer): 부분 배열을 정렬한다.
    • 결합(Combine): 정렬된 부분 배열들을 하나의 배열로 합친다.

 

2. 퀵정렬 특징

- 장점

빠르다 -> O(nlogn)

 

- 단점

최악의 경우 느리다. -> O(n^2)

 

3. 시간 복잡도

- Best Case

피벗을 잘 잡아, 부분배열의 개수가 n/2로 나눠질 경우 : O(nlogn)

Recursion Tree의 깊이 : 최대 logn 이기 때문

 

- Worst Case

부분배열 개수가 불균형하게 분할 되는 경우(n-1,0) : O(n^2)

Recursion Tree의 깊이 : 최대 n 이기 때문

 

4. 구현 방법 (C++)

#include <algorithm>   //swap

void quickSort(int A[], int low, int high) {
    if(low >= high) return; // base condition

    // divide process
    int i = low, j = low;
    int&pivot = A[high];
    for (; j < high; ++j) {
        if ( A[j] < pivot)
            swap(A[i++], A[j]);
    }
    swap(A[i], pivot);

    // conquer process
    quickSort(A, low, i-1);
    quickSort(A, i+1, high);
}

 

Comments