알고리즘(C언어)/이것이 자료구조+알고리즘이다(박상현)_알고리즘
(5)[Chapter12]분할정복_1_병합정렬(이론_노트)
코잼민
2024. 9. 6. 15:02
##이론 노트 PDF파일 :
##이론 노트 사진:
## 퀵소트와 머지소트의 공통점과 차이점 :
- 공통점 : 분할 정복을 알고리즘을 이용한다.(구간을 나누고, 재귀호출 이용)
- 차이점 :
- 퀵소트 : 분할할 때, 구간을 나누는 기준이 PIVOT값이다.
- 머지소트 : 분할할 때, 구간을 나누는 기준이 절반(MID)이다.
##코드 내용 :
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
#include <stdio.h>
#include <stdlib.h>
#pragma warning (disable : 4996)
//2_ 정복 구현부 Merge()
void Merge(int* A, int start, int mid , int end)
{
//1_ 정찰대 2명 선언 , 초기화
int L = start;
int R = mid + 1;
//2_ 임시 배열 동적 할당,임시배열 지정용 인덱스 선언
int* B = (int*)malloc(sizeof(int) * (end - start + 1));
int B_index = 0;
//3_ 정찰_1 시작 : 둘 중 하나가 SCAN이 끝날 때 까지
while (L<=mid&&R<=end) {
if (A[L] < A[R]) {
B[B_index] = A[L];
L++;
}
else {
B[B_index] = A[R];
R++;
}
B_index++;
}
//4_정찰_2 : 둘중 하나가 SCAN이 끝났다면, => 나머지 안끝난 배열을 임시배열에 몽땅 순차적 저장 작업
if (L <= mid)
{
while (L <= mid)
{
B[B_index] = A[L];
L++;
B_index++;
}
}
if (R <= end) {
while (R <= end)
{
B[B_index] = A[R];
R++;
B_index++;
}
}
//5_ 임시배열 B의 내용을 A에 다시 복사 + 붙여넣기
for (int i = 0; i < (end - start + 1); i++) {
A[i + start] = B[i];
}
//6_임시 배열 메모리 해제
free(B);
}
//1_ 분할 정복 MergeSort()
void MergeSort(int* A, int start, int end)
{
//1_ 재귀 종료 조건 : start +1 > end
if (start + 1 > end) return;
//2_ mid 지정
int mid = (start + end) / 2;
//3_ 분할(start ~ ★mid(포함) / mid + 1 ~ end)
MergeSort(A, start, mid);
MergeSort(A, mid+1, end);
//4_ 정복
Merge(A, start, mid, end);
}
void PrintArr(int* arr , int size) {
for (int i = 0; i < size; i++) {
printf(" %d", arr[i]);
}
printf("\n");
}
int main()
{
int N;
int* arr = NULL;
scanf("%d", &N);
arr = (int*)malloc(sizeof(int)*N);
for (int i = 0; i < N; i++) {
scanf("%d", &arr[i]);
}
MergeSort(arr, 0, N - 1);
PrintArr(arr, N);
free(arr);
return 0;
}
|
cs |