[강의정리] 알고리즘 W5 (quicksort, sorting algo)


Quicksort

  • 분할교환정렬(patition exchange sort)라고 불린다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    void quicksort(index low, index high) {
    index pivotpoint;
    if (high > low) {
    partition(low, high, pivotpoint);
    quicksort(low, pivotpoint-1);
    quicksort(pivotpoint+1, high);
    }
    }

    void partition(index low, index high, index& pivotpoint) {
    index i, j;
    keytype pivotitem;
    pivotitem = S[low]; //pivotitem을 위한 첫번째 항목을 고른다.
    j = low;
    for(i = low + 1; i <= high; i++)
    if(S[i] < pivotitem) {
    j++;
    exchange S[i] and S[j];
    }
    pivotpoint = j;
    exchange S[low] and S[pivotpoint]; //pivotitem값을 pivotpoint에 넣는다
    }

분석

  • 단위연산: S[i]와 key와의 비교
  • 입력크기: 부분배열이 가지고 있는 항목의 수, n = high - low + 1
  • 분석: 배열의 첫번째 항목만 제외하고 모든 항목을 한번씩 비교하므로, T(n) = n - 1이다.

최악의 경우 시간복잡도 분석

  • 단위연산: 분할 알고리즘의 S[i]와 pivotitem과의 비교
  • 입력크기: 배열 S가 가지고 있는 항목의 수, n
  • 분석: 이미 비내림차순으로 정렬이 되어있는 배열을 정렬하려는 경우가 최악의 경우가 됨.
      비내림차순이면 첫번째(pivot)항목보다 작은 항목은 없으므로, 크기가 n인 배열은 크기가 0인 부분은 왼쪽에 오고, 크기가 n-1인 부분배열은 오른쪽에 오도록 하여 계속 쪼개진다. 따라서,
      T(n) = T(0) + T(n-1) - n - 1
      그런데 T(0) = 0이므로 재현식은 다음과 같이 된다.
      T(n) = T(n-1) + n - 1, n > 0이면
      T(0) = 0 
      
      이 재현식을 풀면,
      T(n) = T(n-1) + n - 1
      T(n-1) = T(n-2) + n - 2
      T(n-2) = T(n-3) + n - 3
      ...
      T(2) = T(1) + 1
      T(1) = T(0) + 0
      T(0) = 0
      
      T(n) = 1 + 2 + ... + (n-1) = n(n-1) / 2
    

평균의 경우를 고려한 시간복잡도 분석

  • 단위연산: 분할알고리즘의 S[i]와 pivotitem과의 비교
  • 입력크기: 배열이 S가 가지고 있는 항목의 수, n
  • 분석:

댓글