Computer Science/Algorithm

Merge Sort (병합 정렬)

해피단무지 2020. 9. 3. 21:25
#include <stdio.h>
#include <stdlib.h>

#define SIZE 5

int sorted[SIZE];

void merge(int list[], int left, int mid, int right){
  int i, j, k, l;
  i = left;
  j = mid+1;
  k = left;

/* 분할 정렬된 list의 합병 */
  while(i<=mid && j<=right){
    if(list[i]<=list[j])
      sorted[k++] = list[i++];
    else
      sorted[k++] = list[j++];
  }

  // 남아 있는 값들을 일괄 복사, 오른쪽 배열이 남은 경우
  if(i>mid){
    for(l=j; l<=right; l++)
      sorted[k++] = list[l];
  }
  // 남아 있는 값들을 일괄 복사, 왼쪽 배열이 남은 경우 
  else{
    for(l=i; l<=mid; l++)
      sorted[k++] = list[l];
  }

  // 배열 sorted[](임시 배열)의 리스트를 배열 list[]로 재복사
  for(l=left; l<=right; l++){
    list[l] = sorted[l];
  }
}

void mergeSort(int* arr, int start, int end)
{
    int mid = (start+end)/2;
    if (start >= end)
        return ;

    mergeSort(arr, start, mid);
    mergeSort(arr, mid+1, end);
    merge(arr, start, mid, end);
}
int main()
{
    //int size;
    int *arr;

    //scanf("%d", &size);

    arr = (int *)malloc(sizeof(int)*SIZE);

    for (int i=0; i<SIZE; i++){
        scanf("%d", &arr[i]);
    }

    mergeSort(arr, 0, SIZE-1);
    for (int i=0; i<SIZE; i++){
        printf("%d ", arr[i]);
    }

    return 0;
}