병합정렬 (Merge Sort)
시간복잡도 n*log (n) 의 방법 MergeSort
분할정복 알고리즘
- 배열을 반씩 분할
- 동일한 알고리즘을 통해 각각 정렬
- 병합
과정
- 6 개의 정렬되지 않은 정수형 배열 생성 : Arr (5, 8, 3, 9, 1, 2)
- 배열을 Arr1 = (5, 8, 3)과 Arr2 = (9, 1, 2)로 분할
- 다시 Arr3 = (5, 8)과 Arr4 = (3), Arr5 = (9,1)과 Arr6 = (2)로 분할
- 다시 Arr7 = (5), Arr8 = (8), Arr9 = (9), Arr10 = (1) 및 Arr6 = (2)로 분할
- 값을 비교 후 정렬 및 병합
Java 소스
public class mergesort {
static int marr[] = new int[6];
public static void main(String[] args) {
int marr[] = {5, 8, 3, 9, 1, 2};
MergeSort(0, 5, marr);
}
public static void MergeSort(int left, int right, int arr[]) {
int mid = 0;
if (left < right) {
mid = (left + right) / 2;
MergeSort(left, mid, arr);
MergeSort(mid + 1, right, arr);
merge(left, mid, right, arr);
}
}
public static void merge(int left, int mid, int right, int[] arr) {
int l = left;
int m = mid + 1;
int k = left;
while (l <= mid || m <= right) {
if (l <= mid && m <= right) {
if (arr[l] <= arr[m]) {
marr[k] = arr[l++];
} else {
marr[k] = arr[m++];
}
} else if (l <= mid && m > right) {
marr[k] = arr[l++];
} else {
marr[k] = arr[m++];
}
k++;
}
for (int i = left; i < right + 1; i++) {
arr[i] = marr[i];
}
for (int i = 0; i < marr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
}
결과
5 8 3 9 1 2
3 5 8 9 1 2
3 5 8 1 9 2
3 5 8 1 2 9
1 2 3 5 8 9
참고 사이트