- 분할 정복 방법으로, 퀵정렬과 다르게 항상 시간 복잡도가 O(N*logN)을 보장
- 일단 반으로 나누고 나중에 합친다. → 피벗이 없는 이유 : 항상 반으로 나누기 때문
- 합치는 순간에 정렬
- 기존의 데이터를 담을 추가적인 배열 공간이 필요 → 메모리 낭비
문제
- 5, 3, 2, 6, 4, 7, 8, 1을 오름차순으로 나타내시오.
- 정렬배열은 반드시 전역변수로 선언
소스 코드
package _38_midian;
import java.util.Arrays;
public class MergeSort {
static int[] sorted = new int[8];
public static void merge(int a[], int m, int middle, int n) {
int i = m; // 첫 번째 부분집합의 시작 위치 설정
int j = middle+1; // 두 번째 부분집합의 시작 위치 설정
int k = m; // 배열 sorted에 정렬된 원소를 저장할 위치 설정
while(i<=middle && j<=n) {
if(a[i]<=a[j]) {
sorted[k] = a[i];
i++;
}else {
sorted[k] = a[j];
j++;
}
k++;
}
if(i>middle) {
for(int t=j;t<=n;t++,k++) {
sorted[k] = a[t];
}
}else {
for(int t=i;t<=middle;t++,k++) {
sorted[k] = a[t];
}
}
for(int t=m;t<=n;t++) {
a[t] = sorted[t];
}
}
public static void mergeSort(int a[], int m, int n) {
int middle;
if(m<n) {
middle = (m+n)/2;
mergeSort(a, m, middle); // 앞 부분에 대한 분할 작업 수행
mergeSort(a, middle+1, n); // 뒷 부분에 대한 분할 작업 수행
merge(a, m, middle, n); // 부분집합에 대하여 정렬과 병합 작업 수행
}
}
public static void main(String[] args) {
int[] list = {5, 3, 2, 6, 4, 7, 8, 1};
int size = list.length;
mergeSort(list, 0, size-1);
for(int i=0; i<size; i++) {
System.out.print(list[i] + " ");
}
}
}
출력 결과
'5. 알고리즘 > 5_2 실전' 카테고리의 다른 글
[알고리즘] JAVA 계수 정렬 (Counting Sort) 알고리즘 (0) | 2020.02.17 |
---|---|
[알고리즘] JAVA 힙 정렬 (Heap Sort) 알고리즘 (0) | 2020.02.16 |
[알고리즘] JAVA 퀵 정렬 (Quick Sort) 알고리즘 (0) | 2020.02.15 |
[알고리즘] JAVA 삽입 정렬 (Insert Sort) 알고리즘 (0) | 2020.02.13 |
[알고리즘] 버블 정렬 (Bubble Sort) 알고리즘 자바(Java) (0) | 2020.02.13 |