분할 정복(Divide & Conquer) 기법을 사용한 알고리즘 중 하나로 재귀를 이용하기도 한다. 주어진 배열을 원소가 하나밖에 남지 않을때까지 계속 둘로 쪼갠 후에 크기순으로 재배열하면서 원래 크기의 배열로 합친다.
public static void mergeSort(int[] arr) {
sort(arr, 0, arr.length);
}
private static void sort(int[] arr, int low, int high) {
if (high - low < 2) {
return;
}
int mid = (low + high) / 2;
sort(arr, 0, mid);
sort(arr, mid, high);
merge(arr, low, mid, high);
}
private static void merge(int[] arr, int low, int mid, int high) {
int[] temp = new int[high - low];
int t = 0, l = low, h = mid;
while (l < mid && h < high) {
if (arr[l] < arr[h]) {
temp[t++] = arr[l++];
} else {
temp[t++] = arr[h++];
}
}
while (l < mid) {
temp[t++] = arr[l++];
}
while (h < high) {
temp[t++] = arr[h++];
}
for (int i = low; i < high; i++) {
arr[i] = temp[i - low];
}
}
값 비교시에 O(N)의 시간이 소모되고 총 logN번 반복되어야 하므로(반복의 깊이) 총 시간 복잡도는 O(NlogN)임
병합 결과를 담아놓을 배열이 추가로 필요하기에 공간 복잡도는 O(N)임
https://github.com/gyoogle/tech-interview-for-developer/blob/master/Algorithm/MergeSort.md
https://gmlwjd9405.github.io/2018/05/08/algorithm-merge-sort.html
https://www.daleseo.com/sort-merge/
https://propercoding.tistory.com/198
https://velog.io/@eddy_song/merge-sort
https://todaycode.tistory.com/54
https://dongho-dev.tistory.com/1
https://st-lab.tistory.com/233
https://hongcoding.tistory.com/184
https://ittrue.tistory.com/564