본문으로 바로가기

Quick Sort

category CS 공부/Algorithm, Data Structure (재정리) 2021. 4. 7. 00:04

Quick Sort

int partition(int *arr, int left, int right){
    int i = left;
    int j = right;
    int mid = (i + j) / 2;
 
    int tmp = arr[mid];
    arr[mid] = arr[i];
    arr[i] = tmp;
 
    int pivot = arr[i];
 
    while(i < j){
        while(pivot < arr[j]){
            --j;
        }
 
        while(i < j && pivot >= arr[i]){
            ++i;
        }
 
        tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
 
    arr[left] = arr[i];
    arr[i] = pivot;
 
    return i;
}
 
void quickSort(int arr[], int left, int right){
    if(left < right){
        int pivot = partition(arr, left, right);
 
        quickSort(arr, left, pivot-1);
        quickSort(arr, pivot+1, right);
    }
}
  • 퀵정렬은 분할-정복 방식의 O(n logn)의 속도를 지닌 빠른 정렬기법이며,
    같은 시간 복잡도를 지닌 정렬기법이라도 일반적인 경우에는 퀵정렬이 제일 빠른다.
  • 그 이유는 캐시메모리의 히트율이 높은 in-place 기법이며,
    매 라운드마다 pivot의 위치가 정해져서 1개의 원소가 정렬 대상에서 빠져나가기 때문인다. 
  • 정렬된 상태의 배열을 만날 때 최악의 경우로 O(n^2) 속도를 지니지만, 최선, 평균 시간 복잡도는 O(n logn) 이다.
  • 이러한 경우를 극복하기 위해 pivot 선정을 랜덤, 중간값으로 하는 다양한 방식들이 있다.
  • partition 함수는 pivot을 기준으로 그 수보다 작은 수들의 배열, pivot, 큰 수들의 배열로 정렬하는 역할로 O(n) 을 차지한다.
  • quickSort 함수는 partition을 통해 구한 pivot의 위치를 기준으로 또다시 partition을 호출하는 분할하는 역할로 O(logn)을 차지한다.
  • in-place 정렬이므로 공간복잡도는 O(n) 이다,
  • 퀵정렬은 unstable sort 이다.

'CS 공부 > Algorithm, Data Structure (재정리)' 카테고리의 다른 글

Heap Sort 및 Heap  (0) 2021.04.07
Merge Sort  (0) 2021.04.07
Binary Tree  (0) 2021.04.07
Stack, Queue  (0) 2021.04.06
Insertion Sort  (0) 2021.04.06