합병 정렬(Merge Sort)은 정렬 알고리즘 중 하나로, 데이터를 빠르게 정렬하는 방법이다. 🧩 데이터를 반으로 나누고, 정렬한 후에 다시 합치는 과정이다. 구체적으로 알아보자.
합병 정렬은 "분할 정복(Divide and Conquer)" 방법을 사용한다. 문제를 작은 문제로 나누고, 각각을 해결한 후 다시 합치는 방식이다. 이를 통해 데이터가 점점 정렬되는 구조이다.
예를 들어 [8, 4, 7, 3, 1, 5, 6, 2]
라는 리스트가 있다고 하자.
[8, 4, 7, 3]
와 [1, 5, 6, 2]
로 나눈다.[8, 4]
, [7, 3]
, [1, 5]
, [6, 2]
로 나누고, 더 나누면 [8]
, [4]
, [7]
, [3]
등으로 쪼개진다.[4, 8]
, [3, 7]
로 작은 단위끼리 정렬 후 합친다. 이어서 [3, 4, 7, 8]
, [1, 2, 5, 6]
로 합치고, 최종적으로 [1, 2, 3, 4, 5, 6, 7, 8]
로 정렬된다.#include <stdio.h>
int sorted[100],count;
void merge(int list[], int left,int mid, int right) {
int i,j,k,l;
i=left;
j=mid+1;
k=left;
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];
for(l=left; l<=right; l++) list[l]=sorted[l];
}
void mergesort(int list[], int left,int right) {
int mid;
if(left<right) {
mid=(left+right)/2;
mergesort(list,left,mid);
mergesort(list,mid+1,right);
merge(list,left,mid,right);
}
}
int main() {
int list[4]={27,12,20,25};
mergesort(list,0,3);
for(int i=0; i<4; i++) printf("%d ",list[i]);
return 0;
}
합병 정렬은 데이터를 작은 단위로 나누고, 정렬 후 다시 합쳐서 전체를 정렬하는 방식이다.