일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Sprint Security
- While
- Spring Security
- For
- g1gc
- zgc
- jvm
- 연산자
- datastructure
- IAC
- C++
- redis
- UserDetails
- Class
- 자료형
- If
- JavaScript
- 기초
- MergeSort
- JPA
- programmers
- Fluent-bit
- Algorithm
- Java
- lambda
- Kotlin
- datatype
- quicksort
- ansible
- SpringBoot Initializr
Archives
- Today
- Total
뭐라도 끄적이는 BLOG
Sort - MergeSort 본문
MergeSort는 분할 정복 알고리즘 중 하나이다. 배열을 절반으로 나누는 MergeSort를 재귀적으로 불러 각 크기가 1이 될 때까지 나눈다. 나눈 것들을 다시 하나의 배열로 만들면서 정렬한다.
Divide
Combine
MergeSort 과정
MergeSort C Code
void merge(int* arr, int left, int mid, int right)
{
int i, j, k;
int n1 = mid - left + 1;
int n2 = right - mid;
int *L, *R;
L = malloc(sizeof(int) * n1);
R = malloc(sizeof(int) * n2);
for (i = 0; i < n1; i++)
L[i] = arr[left + i];
for (j = 0; j < n2; j++)
R[j] = arr[mid + 1 + j];
i = 0;
j = 0;
k = left;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
arr[k] = L[i];
i++;
}
else {
arr[k] = R[j];
j++;
}
k++;
}
while (i < n1) {
arr[k] = L[i];
i++;
k++;
}
while (j < n2) {
arr[k] = R[j];
j++;
k++;
}
free(L);
free(R);
}
void merge_sort(int *arr, int left, int right)
{
if (left < right)
{
int mid = (left + right) / 2;
merge_sort(arr, left, mid);
merge_sort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}
Merge Sort알고리즘의 특징
장점
- 데이터 분포에 영향을 덜 받는다. 즉, 입력 데이터가 무엇이든 정렬되는 시간은 O(nlog2n)으로 동일하다.
- 연결 리스트로 구성하면 링크 인덱스만 변경 되므로 데이터의 이동은 적어진다.
단점
- 배열로 구성하면 임시배열을 필요로 한다. 배열이 큰 경우 이동 횟수가 많아져 이동에 따른 시간적 낭비를 초래한다.
※참고 자료
반응형
'기본이론 > Algorithm' 카테고리의 다른 글
Dijkstra Java Code (0) | 2023.07.23 |
---|---|
Sort - QuickSort vs MergeSort (0) | 2023.06.18 |
Sort - QuickSort (0) | 2023.06.18 |
Algorithm (0) | 2023.06.18 |