티스토리 뷰

algorithm

C - merge sort

코딩하는 둥아 2020. 3. 11. 12:55
728x90

전형적인 divide-and-conquer 알고리즘이다.

divide-and-conquer이란, 큰 문제를 작은 문제로 쪼개고 쪼개서, 작은 문제를 푼 후 결과를 병합하여 푸는 방법을 의미한다.

#include <stdio.h>
#define max 6

//conquer
void merge(int a[], int low, int mid, int high){
  int b[1000]; // sort된 배열을 넣을 새로운 배열
  int i=low, j=mid+1; //i는 왼쪽 배열의 시작, j는 오른쪽 배열의 시작
  int k=0; //k는 새로 sorted된 array의 현재 위치
  
  //한쪽이 다른 한쪽보다 완전히 작을때까지
  while(i<=mid && j<=high) {
    if(a[i] < a[j]){
      b[k] = a[i];
      k++;
      i++; 
    } else {
      b[k] = a[j];
      k++;
      j++;
    }
  }
  //만약에 왼쪽 배열이 남아있으면, 나머지 왼쪽 배열을 그대로 b array에 넣어줌
  while(i <= mid) {
    b[k]=a[i];
    k++;
    i++;
  }
  //만약에 오른쪽 배열이 남아있으면, 나머지 오른쪽 배열을 그대로 b array에!
  while(j <= high) {
    b[k]=a[j];
    j++;
    k++;
  }
  //마지막에 한번 더 k가 플러스 됐기 때문에 -1
  k--;
  // 새로 만들었던 b배열의 정보를 기존 a배열에 그대로 넣어준다.
  while(k>=0) {
    a[low+k] = b[k];
    k--;
  }
}
//divide
void mergeSort(int a[], int low, int high) {
  // low<high이면 a array의 원소가 하나일 때를 의미
  if(low < high) {
    int mid = (low+high) / 2;
    // 나눠진 배열의 왼쪽 부분
    mergeSort(a, low, mid);
    // 오른쪽 부분
    mergeSort(a, mid+1, high);
    merge(a, low, mid, high);
  }else {
    return;
  }
}

int main() 
{
  int A[max] = { 5, 12, 6, 80, 2, 15 };

  printf("unsorted: ");
  for(int i=0 ; i<max ; i++) {
    printf("%d ", A[i]);
  }
  printf("\n");

  mergeSort(A, 0, max-1);

  printf("sorted: ");
  for(int i=0 ; i<max ; i++) {
    printf("%d ", A[i]);
  }
  printf("\n");

  return 0;
}
728x90

'algorithm' 카테고리의 다른 글

자물쇠와 열쇠  (0) 2022.07.02
이진 탐색 Binary Search  (0) 2022.06.18
C - insertion sort  (0) 2020.03.11
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함