// 병합정렬 분할 함수
void MergeSort(int arg[], int left, int right) {
int mid;
if (left < right) {
mid = (left + right) / 2; // 분할 함수의 중앙 찾기
MergeSort(arg, left, mid); // 병합정렬 왼쪽 부분
MergeSort(arg, mid + 1, right); // 병합정렬 오른쪽 부분
Merge(arg, left, mid + 1, right); // 병합정렬 병합 하기
}
}
처음 매개변수 arg[]는 정렬되지 않은 배열을 받는다.
left는 시작 index, right은 끝 index를 입력받는다.
그러면 if문 조건에 만족하고
절반으로 분할한다.
즉, left와 right은 분할된 배열의 시작과 끝을 의미한다.
if문 조건이 만족하지 않는 순간에 다다르면 MergeSort를 종료하고
Merge를 실행한 후 복귀하면서 정렬한다.
Merge 부분에선 분산된 배열의 범위만큼 정렬하며 배열을 합친다.
// 병합정렬 병합/합병 함수
void Merge(int arr[], int left, int mid, int right) {
int temp[10] = { 0, };
int index = left;
int low = left;
int high = mid;
while ((low < mid) && (high <= right)) {
if (arr[low] < arr[high]) {
temp[index] = arr[low];
low++;
}
else {
temp[index] = arr[high];
high++;
}
index++;
}
if (low < mid) {
for (low = low; low < mid; low++, index++) { // 앞쪽 배열에 남은것 모두 가져오기
temp[index] = arr[low];
}
}
if (high <= right) {
for (mid = high; mid <= right; mid++, index++) { // 뒤쪽 배열에 남은것 모두 가져오기
temp[index] = arr[mid];
}
}
for (index = left; index <= right; index++) {
arr[index] = temp[index];
}
Display(arr, 10);
}