This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revision | |||
| merge_sort [2016/06/07 12:38] – ledyx | merge_sort [2016/06/07 13:03] (current) – 이전 ledyx | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | = Merge Sort (병합 정렬) = | ||
| - | |||
| - | {{tag> | ||
| - | |||
| - | <code java> | ||
| - | A[p ... r]을 정렬한다. | ||
| - | { | ||
| - | if(p < r) then { | ||
| - | q ← (p+r)/2 // 1.중간 지점 계산 | ||
| - | mergeSort(A, | ||
| - | mergeSort(A, | ||
| - | merge(A, p, q, r); // 3. 병합 | ||
| - | } | ||
| - | } | ||
| - | |||
| - | merge(A[], p, q, r) | ||
| - | { | ||
| - | 정렬된 부분배열 2-1, 2-2를 병합 후 | ||
| - | 재정렬, 하나의 배열로 만든다. | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | |||
| - | == Java 구현 == | ||
| - | <sxh java> | ||
| - | import java.util.ArrayList; | ||
| - | |||
| - | public class MergeSort { | ||
| - | |||
| - | public static void main(String[] args) { | ||
| - | int[] arr = {100, 99, 97, 1, 3, 0, -15, 30, 36/6, 7, 2}; | ||
| - | |||
| - | mergeSort(arr, | ||
| - | |||
| - | for (int i = 0; i < arr.length; i++) | ||
| - | System.out.println(arr[i] + " "); | ||
| - | } | ||
| - | |||
| - | private static void mergeSort(int[] arr, int startIndex, int endIndex) { | ||
| - | if (startIndex < endIndex) { | ||
| - | int middleIndex = (startIndex + endIndex) / 2; | ||
| - | |||
| - | mergeSort(arr, | ||
| - | mergeSort(arr, | ||
| - | |||
| - | merge(arr, | ||
| - | } else | ||
| - | return; | ||
| - | } | ||
| - | |||
| - | /** | ||
| - | 1. 두 배열을 합한 크기만큼의 비어있는 임시 배열 준비 | ||
| - | 2. 첫번째 요소끼리 비교하여 작은 요소를 " | ||
| - | 3. 양쪽 배열이 빌 때까지 " | ||
| - | */ | ||
| - | private static void merge(int[] arr, int startIndex, int middleIndex, | ||
| - | int L_startIndex = startIndex; | ||
| - | int R_startIndex = middleIndex + 1; | ||
| - | int tempList_index = 0; | ||
| - | |||
| - | ArrayList< | ||
| - | |||
| - | while (L_startIndex <= middleIndex && R_startIndex <= endIndex) { | ||
| - | if (arr[L_startIndex] < arr[R_startIndex]) | ||
| - | tempList.add(arr[L_startIndex++]); | ||
| - | else | ||
| - | tempList.add(arr[R_startIndex++]); | ||
| - | } | ||
| - | |||
| - | while (L_startIndex <= middleIndex) | ||
| - | tempList.add(arr[L_startIndex++]); | ||
| - | |||
| - | while (R_startIndex <= endIndex) | ||
| - | tempList.add(arr[R_startIndex++]); | ||
| - | |||
| - | while (startIndex <= endIndex) | ||
| - | arr[startIndex++] = tempList.get(tempList_index++); | ||
| - | |||
| - | tempList.removeAll(tempList); | ||
| - | } | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | |||
| - | |||
| - | == C 구현 == | ||
| - | <sxh c> | ||
| - | #include < | ||
| - | #include < | ||
| - | |||
| - | void mergeSort(int arr[], int start_index, | ||
| - | void merge(int arr[], int start_index, | ||
| - | |||
| - | void main() { | ||
| - | int arr[] = {100, 99, 97, 1, 3, 0, -15, 30, 36/6, 7, 2}; | ||
| - | int length = sizeof(arr)/ | ||
| - | int i=0; | ||
| - | |||
| - | mergeSort(arr, | ||
| - | |||
| - | for (i=0 ; i<length ; i++) | ||
| - | printf(" | ||
| - | |||
| - | printf(" | ||
| - | } | ||
| - | |||
| - | void mergeSort(int arr[], int start_index, | ||
| - | { | ||
| - | if(start_index < end_index) { | ||
| - | int middle_index = (start_index+end_index)/ | ||
| - | |||
| - | mergeSort(arr, | ||
| - | mergeSort(arr, | ||
| - | |||
| - | merge(arr, | ||
| - | } | ||
| - | else | ||
| - | return; // start_index >= end_index, 원소가 딱 하나 남았을 때 탈출! | ||
| - | } | ||
| - | |||
| - | /** | ||
| - | 1. 두 배열을 합한 크기만큼의 비어있는 임시 배열 준비 | ||
| - | 2. 첫번째 요소끼리 비교하여 작은 요소를 " | ||
| - | 3. 양쪽 배열이 빌 때까지 " | ||
| - | **/ | ||
| - | void merge(int arr[], int start_index, | ||
| - | { | ||
| - | int LStart_index = start_index; | ||
| - | int RStart_index = middle_index+1; | ||
| - | |||
| - | int* tempArr = (int*) malloc(sizeof(int) * (end_index - start_index+1)); | ||
| - | int tempArr_index = 0; | ||
| - | |||
| - | while(LStart_index <= middle_index && RStart_index <= end_index) { | ||
| - | if(arr[LStart_index] < arr[RStart_index]) | ||
| - | tempArr[tempArr_index++] = arr[LStart_index++]; | ||
| - | else | ||
| - | tempArr[tempArr_index++] = arr[RStart_index++]; | ||
| - | } | ||
| - | |||
| - | while (LStart_index <= middle_index) | ||
| - | tempArr[tempArr_index++] = arr[LStart_index++]; | ||
| - | |||
| - | while (RStart_index <= end_index) | ||
| - | tempArr[tempArr_index++] = arr[RStart_index++]; | ||
| - | |||
| - | |||
| - | // 2-1. " | ||
| - | tempArr_index = 0; | ||
| - | while (start_index <= end_index) | ||
| - | arr[start_index++] = tempArr[tempArr_index++]; | ||
| - | |||
| - | free(tempArr); | ||
| - | } | ||
| - | </ | ||