병합정렬(Merge Sort) 알고리즘-자료구조2017. 4. 29. 22:07
#include <stdio.h> | |
void merge(int *arr, int *sorted, int left, int mid, int right){ | |
int L1 = left; | |
int L2 = mid+1; | |
int idx= left; | |
while(L1 <= mid && L2 <= right){ | |
if(arr[L1] <= arr[L2]) sorted[idx++]=arr[L1++]; | |
else sorted[idx++]=arr[L2++]; | |
} | |
if(L1 > mid){ | |
L1 = L2; | |
mid = right; | |
} | |
while(L1 <= mid){ | |
sorted[idx++] = arr[L1++]; | |
} | |
while(left <= right){ | |
arr[left] = sorted[left++]; | |
} | |
} | |
void divide(int *arr, int *sorted, int left, int right){ | |
if(left >= right) return; | |
int mid = (left + right) / 2; | |
divide(arr, sorted, left, mid); | |
divide(arr, sorted, mid+1, right); | |
merge(arr, sorted, left, mid, right); | |
} | |
void MergeSort(int *arr, int left, int right){ | |
int sorted[right+1]; | |
divide(arr, sorted, left, right); | |
} | |
int main (){ | |
int arr[] = {1, 9, 2, 6, 4, 0, 9}; | |
MergeSort(arr, 0, (sizeof(arr)/sizeof(arr[0]))-1); | |
for(int i=0; i<sizeof(arr)/sizeof(arr[0]); i++){ | |
printf("%d ", arr[i]); | |
} | |
printf("\n"); | |
return 0; | |
} |
정렬 중 O(nlogn)의 시간복잡도를 가진 방법으로, 개인적으로는 퀵소트나 힙정렬 보다는 구현이 간단하다.
정렬해야하는 원소가 적다면(정확한 것은 모르겠지만 5개 이하) 삽입정렬이 더 낫다고도 한다.
스택오버플로우를 보면 퀵 정렬이 최악의 경우 O(n^2)임에도 여러가지 이유로
병합 정렬보다 나은 성능을 보인다고 하는데, 확인해보아야 할 듯 싶다.
C++ std library에는 퀵 정렬과 힙 정렬을 적당히(?) 활용한 Intro sort라는 게 쓰이는 듯 하다.
(http://stackoverflow.com/questions/70402/why-is-quicksort-better-than-mergesort)
https://gist.github.com/woo972/0924604b96188cb78b9cf8b1a34fbd19
'알고리즘-자료구조' 카테고리의 다른 글
SegmentTree(구간트리) (0) | 2017.02.19 |
---|