티스토리 뷰

분할 정복을 이용한 정렬 알고리즘

  1. 분할 : 배열을 2등분하여 2개의 부분배열로 만든다.
  2. 정복 : 각각의 부분배열을 정렬한다. (재귀)
  3. 통합 : 정렬된 부분배열을 정렬된 하나의 배열로 합친다.
#define N 6

int data[N] = {40, 6, 1, 9, 3, 5};
int temp[N];
int cnt;

mergeSort(0, N - 1);

void mergeSort(int left, int right)
{
    int mid = (left + right) / 2;

    if (right == left)
        return;
    mergeSort(left, mid);
    mergeSort(mid + 1, right);
    merge(left, right);
}

void merge(int left, int right)
{
    cnt = 0;
    int mid = (left + right) / 2;
    int i = left;
    int j = mid + 1;
    while (right >= left + cnt)
    {
        if (data[i] < data[j] || j > right)
        {
            temp[cnt++] = data[i];
            i++;
        }
        else
        {
            temp[cnt++] = data[j];
            j++;
        }
    }
    for (i = 0; i < cnt; i++)
        data[left + i] = temp[i];
}
  • 시간복잡도 : O(Nlog(N))
  • 공간복잡도 : O(N)
댓글