#include <stdio.h>
void MergeSort(int *arr, int start, int end, int mid)
{
int left = start, right = end, r_mid = mid + 1, sorted_index = start;
// 왼쪽과 오른쪽을 비교 후 sorted배열에 저장
while (left <= mid && r_mid <= right) // 왼쪽과 mid비교 후 작으면 진행, mid+1과 오른쪽비교 후 작으면 진행
{
// 왼쪽과 mid+1 즉, 왼쪽과 우측 첫번째 데이터와 비교 후 작은것을 sorted배열에 저장
if (arr[left] <= arr[r_mid])
{
sorted[sorted_index++] = arr[left++];
}
else
{
sorted[sorted_index++] = arr[r_mid++];
}
}
// left가 mid보다 더 커지면
if (left > mid)
{
// 우측 데이터들을 그대로 sorted배열에 저장 (이미 정렬되어 있으므로)
for (int i = r_mid; i <= end; i++)
{
sorted[sorted_index++] = arr[i];
}
}
else
{
// 좌측 데이터들을 그대로 sorted배열에 저장 (이미 정렬되어 있으므로)
for (int i = left; i <= mid; i++)
{
sorted[sorted_index++] = arr[i];
}
}
// arr배열에 sorted 데이터를 재저장 (기존 배열)
for (int i = start; i <= end; i++)
{
arr[i] = sorted[i];
}
}
void DivideAndMerge(int *arr, int left, int right)
{
int mid;
if (left < right)
{
mid = (left + right) / 2;
DivideAndMerge(arr, left, mid); // 좌측 쪼개기
DivideAndMerge(arr, mid + 1, right); // 우측 쪼개기
MergeSort(arr, left, right, mid); // 병합 정렬 진행
}
}
int main(void)
{
int N[5] = { 1, 5, 4, 3, 2 };
DivideAndMerge(N, 0, 4);
for (int i = 0; i < 5; i++)
printf("%d ", N[i]);
}
반응형
'e. 자료구조 및 알고리즘' 카테고리의 다른 글
C언어 퀵정렬(Quick Sort) (0) | 2019.07.12 |
---|---|
C언어 합병정렬(Merge Sort 2) (0) | 2019.07.12 |
C언어 단방향 큐 (Queue) (0) | 2019.06.28 |
C언어 단방향 연결리스트 (LinkedList) (0) | 2019.06.27 |