병합 정렬은 분할 정복(Divide and Conquer) 알고리즘을 기반으로 하는 정렬 방식으로, 데이터를 작게 나누고 다시 정렬하며 합치는 방식으로 동작합니다. 데이터의 크기와 무관하게 항상 안정적이고 예측 가능한 성능을 보장하기 때문에 많은 환경에서 사용됩니다.
👉 쉽게 말해, 쪼개고, 쪼개고, 나중에 정렬하면서 합치는 것!
최선 | O(n log n) |
평균 | O(n log n) |
최악 | O(n log n) |
공간 복잡도 | O(n) (새로운 배열이 필요함) |
public class MergeSortExample {
// 병합 정렬 메서드
public static void mergeSort(int[] arr, int left, int right) {
if (left < right) {
// 배열을 절반으로 나누기
int mid = (left + right) / 2;
// 왼쪽 절반 정렬
mergeSort(arr, left, mid);
// 오른쪽 절반 정렬
mergeSort(arr, mid + 1, right);
// 정렬된 두 배열 병합
merge(arr, left, mid, right);
}
}
// 병합(Merge) 메서드
public static void merge(int[] arr, int left, int mid, int right) {
// 배열의 크기 계산
int n1 = mid - left + 1;
int n2 = right - mid;
// 임시 배열 생성
int[] L = new int[n1];
int[] R = new int[n2];
// 데이터 복사
for (int i = 0; i < n1; ++i)
L[i] = arr[left + i];
for (int j = 0; j < n2; ++j)
R[j] = arr[mid + 1 + j];
// 병합
int i = 0, j = 0;
int k = left;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
arr[k] = L[i];
i++;
} else {
arr[k] = R[j];
j++;
}
k++;
}
// 남은 요소 복사
while (i < n1) {
arr[k] = L[i];
i++;
k++;
}
while (j < n2) {
arr[k] = R[j];
j++;
k++;
}
}
// 배열 출력 메서드
public static void printArray(int[] arr) {
for (int num : arr)
System.out.print(num + " ");
System.out.println();
}
// 실행 메서드
public static void main(String[] args) {
int[] numbers = {38, 27, 43, 3, 9, 82, 10};
System.out.println("정렬 전 배열:");
printArray(numbers);
mergeSort(numbers, 0, numbers.length - 1);
System.out.println("정렬 후 배열:");
printArray(numbers);
}
}
정렬 전 배열:
38 27 43 3 9 82 10
정렬 후 배열:
3 9 10 27 38 43 82
정렬 방식 | 분할 후 병합 (Divide and Conquer) |
정렬 속도 | 항상 O(n log n) |
공간 사용 | O(n) (추가 배열 필요) |
안정성 | 안정 정렬 (순서 유지) |
활용 예 | 대량 데이터 정렬, 외부 정렬 등 |
이진 탐색(Binary Search) (0) | 2025.06.15 |
---|---|
선형 탐색(Linear Search) (0) | 2025.06.15 |
퀵 정렬(Quick Sort) (0) | 2025.06.15 |
버블 정렬(Bubble Sort) (0) | 2025.06.15 |
알고리즘이란 무엇인가요? (0) | 2025.06.15 |