Merge Sort
정의: 분할정복 방식을 사용해 데이터를 분할하고 분할한 집합을 합치는 알고리즘이다.
- 시간 복잡도는 O(nlogn)
-> 배열의 크기를 n이라 할때, 분할 할때 마다 배열의 크기가 n/2씩 감소.
이때 분할하는데 걸리는 시간은 O(log n)
-> 정복(합병)할때 마다 두 배열을 비교하면서 작은 요소부터 차례로 결과 배열에 추가.
이 과정에서 최대 (n)개의 요소를 비교하게 되므로, 두 개의 배열을 합치는 데 걸리는 시간은 O(n)
- 대량의 데이터 정렬에 주로 사용.
public class sort {
public static void merge(int A[], int low, int mid, int high) {
int B[] = new int[high + 1];
int h = low;
int i = low;
int j = mid + 1;
int k;
while (i <= mid && j <= high) {
if (A[i] < A[j]) {
B[h] = A[i];
i++;
} else{
B[h] = A[j];
j++;
}
h++;
}
if (i > mid) {
for (k = j; k <= high; k++) {
B[h] = A[k];
h++;
}
}else {
for (k = i; k <= mid; k++) {
B[h] = A[k];
h++;
}
}
for (k = low; k<=high; k++) {
A[k] = B[k];
}
}
public static void printArray(int A[]) {
for (int i = 0; i < A.length; i++) {
System.out.print(A[i] + " ");
}
}
public static void mergeSort(int A[], int low, int high) {
if (low < high) {
int mid = (low+high) /2;
mergeSort(A,low,mid);
mergeSort(A,mid+1,high);
merge(A,low,mid,high);
}
}
public static void main(String[] args) {
int A[] = {91, 82, 13, 85, 68, 70, 98, 24};
System.out.println("정렬전");
printArray(A);
System.out.println("정렬후");
mergeSort(A,0,A.length-1);
printArray(A);
}
}