Special Thanks to @hanjiwon1108
합병 정렬은 분할 정복(Divide and Conquer) 기반의 알고리즘으로, 데이터의 정렬 여부와 관계없이 O(n log n)의 시간 복잡도를 유지합니다.
#include <stdio.h>
int sorted[100];
void merge(int list[], int left, int mid, int right) {
int 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++];
}
}
while (i <= mid) sorted[k++] = list[i++];
while (j <= right) sorted[k++] = list[j++];
for (int l = left; l <= right; l++) {
list[l] = sorted[l];
}
}
void mergesort(int list[], int left, int right) {
if (left < right) {
int 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;
}
{27, 12, 20, 25}
배열을 정렬하여 {12, 20, 25, 27}
로 출력합니다.합병 정렬은 큰 데이터에도 효율적이며, 안정적인 정렬이 필요한 경우 적합한 알고리즘입니다. 다만, 추가적인 메모리 사용이 단점이 될 수 있습니다.