반응형
병합 정렬이란?
정렬하고자 하는 배열을 계속 반으로 쪼개어 잘게 나누어진 배열끼리 정렬 후 다시 합쳐서 정렬하며 완성해 나가는 과정이다.
Divide And Conquer
1단계 :: 분할(Divide) 해결이 용이한 단계까지 문제를 분할해 나간다.
2단계 :: 정복(Conquer) 해결이 용이한 수준까지 분할된 문제를 해결한다.
3단계 :: 결합(Combine) 분할해서 해결한 결과를 결합하여 마무리 한다.
MergeSort(ar, mid);
MergeSort(ar + mid, len - mid); 이 코드가 병합 정렬을 시도하기 위해 반으로 계속 나누는 과정을 이행해준다.
(왜냐면 앞의 int mid = len / 2;가 있기 때문이다.)
시간 복잡도는 T(n) = 2T(n/2) + n, T(n) = Θ(n log n) 즉, O(nlogn)이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | #include <iostream> int MergeSort(int *ar, int len) { if (len < 2) return 0; int mid = len / 2; MergeSort(ar, mid); MergeSort(ar + mid, len - mid); int *buf = new int[len]; int i = 0; int j = mid; int k = 0; while (i < mid && j < len) buf[k++] = (ar[i] < ar[j]) ? ar[i++] : ar[j++]; while (i < mid) buf[k++] = ar[i++]; while (j < len) buf[k++] = ar[j++]; for (i = 0; i < len; i++) ar[i] = buf[i]; delete[] buf; } int main(void) { int arr[4] = { 3,4,2,1 }; int i; int len = sizeof(arr) / sizeof(int); MergeSort(arr, len); for (i = 0; i < 4; i++) printf("%d ", arr[i]); return 0; } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
반응형
'Applied > 알고리즘' 카테고리의 다른 글
다양한 알고리즘 그림으로 볼 수 있는 사이트 (0) | 2016.09.22 |
---|---|
병합 정렬(Merge Sort) (2) (0) | 2016.09.08 |
버블 정렬(Bubble Sort) (0) | 2016.08.30 |
std sort 알고리즘 (0) | 2016.08.22 |
다양한 Sorting을 보여주는 동영상 (0) | 2016.08.06 |