우리는 저렇게 잘린 배열을 하나하나 붙여 가며 정렬할 것이다 말로 하면 어려우니 밑에 그림을 보도록 하자!
#include <stdio.h>
int sorted[10];
void merge(int a[], int s, int middle, int e){
int i = s;
int j = middle + 1;
int k = s;
while(i <= middle && j <= e){
if(a[i] <= a[j]){
sorted[k] = a[i];
i++;
} else{
sorted[k] = a[j];
j++;
}
k++;
}
if(i > middle){
for(int t = j; t <= e; t++){
sorted[k] = a[t];
k++;
}
} else{
for(int t = i; t <= middle; t++){
sorted[k] = a[t];
k++;
}
}
for(int t = s; t <= e; t++){
a[t] = sorted[t];
}
}
//모두 반으로 나누기
void mergeSort(int a[], int s, int e){
if(s < e){
int middle = (s + e)/2;
mergeSort(a, s, middle);
mergeSort(a, middle + 1, e);
merge(a, s, middle, e);
}
}
int main(void){
int arr[10] = {1,5,2,7,9,3,4,10,8,6};
mergeSort(arr, 0, 9);
for(int i = 0; i < 10; i++){
printf("%d ", sorted[i]);
}
return 0;
}
위의 코드가 전체 코드이다. 이렇게 보면 어려워 보일 수 있으니 밑에서 설명할 때는 부분 부분 파트를 나눠서
설명하도록 하겠다.
Part 01. mergeSort 함수
//s = start 시작하는 인덱스
//e = end 끝나는 인덱스
//반으로 계속 쪼개주는 함수
void mergeSort(int a[], int s, int e){
if(s < e){
int middle = (s + e)/2;
mergeSort(a, s, middle);
mergeSort(a, middle + 1, e);
merge(a, s, middle, e); //<---- 이 부분은 일단 넘어가도록 하자 이따 설명 하겠다
}
}
이 함수는 첫 번째 그림처럼 하나하나 다 쪼개 주는 재귀 함수이다.
말만 쪼개주는 거지 진짜 따로 배열을 만들어 쪼개는 것은 아니다 ㅎㅎ
( 나는 처음에 이게 너무 헷갈렸다 "왜 쪼갠다면서 안 쪼개는 겨???" )
if(s < e){
code....
}
start와 end가 같으면 실행 안 해!!
즉 배열의 크기가 1이상이여야 한다
(start, end 분포도 그림에서 맨 마지막에 start와 end가 같은 곳을 가리키는 곳이 있었는데 거기서 끝낼 수 있도록 하기 위해서)
int middle = (s + e)/2;
mergeSort(a, s, middle);
mergeSort(a, middle + 1, e);
merge(a, s, middle, e); //<---- 이 부분은 일단 넘어가도록 하자 이따 설명 하겠다
일단 우리는 middle이라는 것을 알아야 한다 그래야 반을 쪼개고 쪼개고 계속 쪼갤 수 있기 때문이다.
그리고 얻어낸 Middle을 기준으로 왼쪽 오른쪽으로 계속 쪼개서 Start와 End가 같은 곳을 가리키는 곳까지 즉 한 개가 될 때까지 나누는 함수이다!!
위에 보이는 merge 함수는 바로 다음 파트에서 설명하겠다
Part 02. merge 함수
void merge(int a[], int s, int middle, int e){
int i = s;
int j = middle + 1;
int k = s;
while(i <= middle && j <= e){
if(a[i] <= a[j]){
sorted[k] = a[i];
i++;
} else{
sorted[k] = a[j];
j++;
}
k++;
}
if(i > middle){
for(int t = j; t <= e; t++){
sorted[k] = a[t];
k++;
}
} else{
for(int t = i; t <= middle; t++){
sorted[k] = a[t];
k++;
}
}
for(int t = s; t <= e; t++){
a[t] = sorted[t];
}
}
이 함수는 마지막 재귀 함수가 끝나고 처음 호출된 부분으로 돌아오는 과정에서 나눠진 하나하나가 정렬되어 결합되게 하는 함수이다