What
병합정렬이란 조각조각내어 각 구간의 정렬하고 결과 값을 합치는 정렬 알고리즘이다.
시간복잡도는? O(n log n)
- 시간복잡도 O(n log n)이지만 메모리를 퀵소트에 비교적 많이 사용된다는 점이 단점이다. 동작원리를 보자보자
동작원리

전반적 코드 흐름
- 쪼개기 ….
- 쪼개는 구간이 없으면 새로운 배열을 생성해 정렬하자
How

Why
- Java를 쓰게 되면 Arrays.sort, Collections.sort 라는 메소드의 동작원리의 기반이 되는 정렬(dual-pivot quick sort, 혹은 TimSort(mergeSort + quickSort) )이다. 사용하는데 모르고 있어도 크게 상관 없지만 이처럼 라이브러리를 사용하면서 원리를 안다는 것은 좋은 습관이기 때문이다.
Code
import java.util.Arrays; import java.util.Scanner; public class MergeSort { static int left[]; static int right[]; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = Integer.parseInt(sc.nextLine()); int[] arr = new int[n]; for (int i = 0; i < n; i++) { arr[i] = Integer.parseInt(sc.nextLine()); } divide(0, arr.length - 1, arr); Arrays.stream(arr).forEach(System.out::println); } public static void divide(int s, int e, int[] arr) { if (e - s < 1) return; int mid = (s + e) >> 1; divide(s, mid, arr); divide(mid + 1, e, arr); int[] temp = new int[e - s + 1]; int tIdx = 0; int leftIdx = s; int rightIdx = mid + 1; while (leftIdx <= mid && rightIdx <= e) { if (arr[leftIdx] < arr[rightIdx]) { temp[tIdx++] = arr[leftIdx++]; } else { temp[tIdx++] = arr[rightIdx++]; } } while (leftIdx <= mid) { temp[tIdx++] = arr[leftIdx++]; } while (rightIdx <= e) { temp[tIdx++] = arr[rightIdx++]; } tIdx = 0; for (int i = s; i <= e; i++) { arr[i] = temp[tIdx++]; } } }