공부/Algorithm
MergeSort
Egomi
2018. 7. 9. 21:55
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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | // 단순정렬 // 합병정렬 #include <stdio.h> int N; int arr[30000]; void simple_sort() { int i, j, temp; for (i = 0; i < N; i++) { for (j = i + 1; j < N; j++) { if (arr[i] > arr[j]) { temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } } void merge_sort( int s, int e) { int i, j, k, m; if (s >= e) return ; m = (s + e) / 2; merge_sort(s, m); merge_sort(m + 1, e); // ******주의****** // k는 1이 아니라, s임!! // (s부터 e까지 정렬하기 때문!!!!! i = s; j = m + 1; k = s; // 왼쪽 영역, 오른쪽 영역 끝 전까지 반복 // 왼쪽 영역과 오른쪽 영역 비교하면서 temp 배열에 배치하면서 정렬 // 남아있는 왼쪽, 오른쪽 영역을 temp배열에 담기 // temp 배열을 원본에 복사 int tmp[30000]; while (i<=m && j<=e) { if (arr[j]>arr[i]) tmp[k++] = arr[i++]; else tmp[k++] = arr[j++]; } while (i<=m) { // 왼쪽 영역이 영역 안쪽에 있는 경우 옮겨 담음 tmp[k++] = arr[i++]; } while (j<=e) { // 오른쪽 영역이 영역 안쪽에 있는 경우 옮겨 담음 tmp[k++] = arr[j++]; } for (i=s;i<=e;i++) arr[i] = tmp[i]; // ******주의****** // for 문 범위 주의하기!!! 정렬을 진행한 s~e까지만 담는다! } int main( int argc, char *argv[]) { int i; scanf ( "%d" , &N); for (i = 0; i<N; i++) { scanf ( "%d" , &arr[i]); } merge_sort(0, N - 1); for (i = 0; i < N; i++) printf ( "%d " , arr[i]); return 0; } /************************************************************** Problem: 2544 User: AXQ6548 Language: C Result: Accepted Time:18 ms Memory:2952 kb ****************************************************************/ |