Merge Sort
동작 방식
1

2

3

4

5

6

7

8

9

10

11

구현
package sort;
public class MergeSort {
public static void main(String[] args) {
MergeSort mergeSort = new MergeSort();
int[] A = {6, 4, 3, 7, 5, 1, 2};
mergeSort.sort(A);
mergeSort.printArray(A);
}
public void sort(int[] A) {
sort(A, 0, A.length - 1);
}
private void sort(int[] A, int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
sort(A, left, mid); // 왼쪽 절반 정렬
sort(A, mid + 1, right); // 오른쪽 절반 정렬
merge(A, left, mid, right);
}
}
public void printArray(int[] A) {
for (int num : A) {
System.out.print(num + " ");
}
}
private void merge(int[] A, int left, int mid, int right) {
int n1 = mid - left + 1; // 왼쪽 부분 배열 크기
int n2 = right - mid; // 오른쪽 부분 배열 크기
int[] leftArray = new int[n1]; // 왼쪽 부분 배열
int[] rightArray = new int[n2]; // 오른쪽 부분 배열
// 왼쪽 배열에 n1 크기만큼 원본 데이터 복사
for (int i = 0; i < n1; i++) {
leftArray[i] = A[left + i];
}
// 오른쪽 배열에 n2 크기만큼 원본 데이터 복사
for (int j = 0; j < n2; j++) {
rightArray[j] = A[mid + 1 + j];
}
int i = 0; // 왼쪽 배열 인덱스
int j = 0; // 오른쪽 배열 인덱스
int k = left; // 병합 될 배열의 인덱스 시작점
while (i < n1 && j < n2) {
if (leftArray[i] <= rightArray[j]) {
A[k] = leftArray[i];
i++;
} else {
A[k] = rightArray[j];
j++;
}
k++;
}
while (i < n1) {
A[k] = leftArray[i];
i++;
k++;
}
while (j < n2) {
A[k] = rightArray[j];
j++;
k++;
}
}
}풀이
선택 가이드
시간 복잡도
장점
단점
Last updated