##이론 노트 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 |
'알고리즘(C언어) > 이것이 자료구조+알고리즘이다(박상현)_알고리즘' 카테고리의 다른 글
(7)[Chapter12]분할정복_3_피보나치 수열(작성중) (2) | 2024.09.07 |
---|---|
(6)[Chapter12]분할정복_2_거듭제곱 (0) | 2024.09.06 |
(4)[Chapter11]알고리즘_성능분석_4_재귀함수_시간복잡도구하기(마스터정리) (0) | 2024.09.01 |
(3)[Chapter11]알고리즘_성능분석_3_측정시간과 점근표기법 (0) | 2024.09.01 |
(2)[Chapter11]알고리즘_성능분석_2_퀵정렬_복습 (0) | 2024.08.31 |