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 | 31 |
Tags
- 프로그래머스
- CS지식
- 자바스크립트
- 플러터
- baekjoon
- 시큐리티
- python
- 자료구조
- 파이썬
- JPA
- 데이터베이스
- spring
- 스프링부트
- postgresql
- 리눅스
- 스프링
- Oracle
- 백준
- Java
- DB
- 네트워크
- backjoon
- springboot
- javascript
- 자바
- 스프링 부트 쇼핑몰 프로젝트 with JPA
- Spring Security
- CS
- Flutter
- 데이터
Archives
- Today
- Total
Jin's Dev Story
[알고리즘]합병 정렬(병합 정렬(Merge Sort)) 본문
분할 정복이란?
큰 문제를 작은 문제 단위로 쪼개면서 해결해나가는 방식
- 평균 : Θ(nlogn), 최선 : Ω(nlogn), 최악 : O(nlogn)
- mergeSort
public void mergeSort(int[] array, int left, int right) {
if(left < right) {
int mid = (left + right) / 2;
mergeSort(array, left, mid);
mergeSort(array, mid+1, right);
merge(array, left, mid, right);
}
}
퀵정렬과의 차이점
퀵정렬 : 우선 피벗을 통해 정렬(partition) → 영역을 쪼갬(quickSort)
합병정렬 : 영역을 쪼갤 수 있을 만큼 쪼갬(mergeSort) → 정렬(merge)
- merge()
public static void merge(int[] array, int left, int mid, int right) {
int[] L = Arrays.copyOfRange(array, left, mid + 1);
int[] R = Arrays.copyOfRange(array, mid + 1, right + 1);
int i = 0, j = 0, k = left;
int ll = L.length, rl = R.length;
while(i < ll && j < rl) {
if(L[i] <= R[j]) {
array[k] = L[i++];
}
else {
array[k] = R[j++];
}
k++;
}
// remain
while(i < ll) {
array[k++] = L[i++];
}
while(j < rl) {
array[k++] = R[j++];
}
}
⇒ 합병의 대상이 되는 두 영역이 각 영역에 대해서 정렬이 되어있기 때문에 단순히 두 배열을 순차적으로 비교하면서 정렬할 수가 있음
'CS 지식 > [알고리즘]' 카테고리의 다른 글
[알고리즘] 유클리드 호제법 (0) | 2023.10.20 |
---|---|
[알고리즘] 브루트포스 (0) | 2023.10.20 |
[알고리즘] 선택 정렬(Selection Sort) (0) | 2023.07.18 |
[알고리즘] 버블 정렬(Bubble Sort) (0) | 2023.07.18 |
[알고리즘]퀵 정렬(Quick Sort) (0) | 2023.07.18 |