Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Algorithm
- 영속성 컨텍스트
- 즉시로딩
- Embeddable
- Spring Data JPA
- ROLLBACK
- DiscriminatorColumn
- relational DB
- 지연로딩
- n+1문제
- 정렬
- 플러시
- relational database
- JPA
- 페치조인
- 관계형 데이터베이스
- commit
- 순수jpa
- Spring
- Amortized Analysis
- 엔티티 매핑
- 영속성전이
- 값타입
- DB
- MappedSuperclass
- Flush
- DiscriminatorValue
- 분할상환분석
- fetch join
- 고아객체
Archives
- Today
- Total
Jun's note
[Algorithm] 합병정렬 (Merge Sort) C++ 본문
728x90
1. 합병정렬 정의
분할 정복 알고리즘의 하나로, 더 이상 쪼개지지 않을때까지 작은 크기로 분할하여, 작은 배열끼리 비교하는 과정을 수행해 하나의 배열로 합치는 정렬이다.
- 과정
- 1. 원래 배열을 두 개의 작은 배열로 분할하여 더 이상 쪼개지지 않을 때까지 재귀적으로 수행한다.
- 2. 가장 작은 크기의 배열부터 시작하여, 두 개의 배열을 서로 비교하면서 오름차순(또는 내림차순)으로 정렬해 합친다.
- 합병정렬 예제
2. 합병정렬 특징
- 장점
안정적인 정렬 방법 (입력한 값이 무엇이든 간에 정렬되는 시간은 O(nlog2n)으로 동일하다)
- 단점
배열 크기가 큰 경우에는 이동횟수가 많아 시간적 측면에서 크게 낭비된다.
3. 시간 복잡도
- Best Case
O(nlog2n)
- Worst Case
O(nlog2n)
4. 구현 방법 (C++)
int arr[100];
int sorted[100];
void merge(int start, int end){
int mid = (start + end) / 2;
int i = start, j = mid+1, k = start;
while (i <= mid && j <= end) {
if (arr[i] <= arr[j])
sorted[k++] = arr[i++];
else
sorted[k++] = arr[j++];
}
while (i <= mid)
sorted[k++] = arr[i++];
while (j <= end)
sorted[k++] = arr[j++];
for (int i = start; i <= end; i++) {
arr[i] = sorted[i];
}
}
void merge_sort(int start, int end) {
if (start < end) {
int mid = (start + end) / 2;
merge_sort(start, mid);
merge_sort(mid + 1, end);
merge(start, end);
}
}
'Computer Science > Algorithm' 카테고리의 다른 글
[Algorithm] 기수정렬 (Radix Sort) C++ (0) | 2022.01.06 |
---|---|
[Algorithm] Quick Sort (퀵정렬) C++ (0) | 2022.01.03 |
[Algorithm] Insertion Sort (삽입정렬) C++ (0) | 2022.01.02 |
Amortized Analysis (분할상환분석) (0) | 2021.12.31 |
Comments