A[1,2,3,...N]이 때, 다음과 같은 조건을 만족하는 A의 일부분인 다음과 같은 배열에 대해 생각해보자.
A[p,p+1,...,q,q+1,...,r] (A[p,q]와 A[q+1,r]은 이미 정렬되어진 상태인 A의 부분 배열)이 배열을 p, r까지 정렬하는 코드가 아래에 있는 MERGE이고, 이 함수를 사용하여 자기 자신을 여러 번 호출하여 원래의 문제를 해결하는 함수가 MERGE-SORT이다. 실제 예를 통해 이러한 방법을 살펴보자. 배열 A가 다음과 같이 구성되어 있다.
[5,2,4,7,1,3,2,6]MERGE-SORT가 호출되는 순서를 인수로 살펴보면 다음과 같다.
A, 1, 8 -> A, 1, 4 -> A, 1, 2 -> A, 1, 1 -> A, 2, 2 -> A, 3, 4 -> A, 3, 3 -> A, 4, 4 A, 5, 8 -> A, 5, 6 -> A, 5, 5 -> A, 6, 6 -> A, 7, 8 -> A, 7, 7 -> A, 8, 8p, r 값이 같은 경우, 하나의 값을 가진 배열은 이미 정렬된 것이기 때문에, 아무 일도 일어나지 않는다. 그러나 r값이 p값보다 큰 경우에는 MERGE가 일어난다. 이를 그림으로 나타나면 다음과 같다. 각 화살표가 MERGE를 나타낸다.
Pseudo 코드
MERGE(A, p, q , r) 01 n1 = q - p + 1 02 n2 = r -q 03 L[1,2,...,n1+1], R[1,2,...,n2+1] 배열 생성 04 for i <- 1 to n1 05 do L[i] <- A[p+i-1] 06 for j <- 1 to n2 07 do R[j] <- A[q+j] 08 L[n1+1] <- ∞ 09 R[n2+1] <- ∞ 10 i <- 1 11 j <- 1 12 for k <- p to r 13 do if L[i] <= R[j] 14 then A[k] <- L[i] 15 i <- i + 1 16 else A[k] <- R[j] 17 j <- j + 1이제 MERGE-SORT을 살펴보자.
MERGE-SORT(A, p, r) 1 if p < r 2 then q <- (p+r)/2보다 작은 정수 중 가장 큰 수 3 MERGE-SORT(A, p, q) 4 MERGE-SORT(A, q+1, r) 5 MERGE(A, p, q, r)이제 MERGE_SORT(A, 1, A의 크기)을 한 번 호출함으로 정렬이 된다.
public class MergeSort { public static void main(String[] args) { int[] arrays = new int[8]; arrays[0] = 5; arrays[1] = 2; arrays[2] = 4; arrays[3] = 7; arrays[4] = 1; arrays[5] = 3; arrays[6] = 2; arrays[7] = 6; mergeSort(arrays, 0, arrays.length-1); for ( int i = 0; i < arrays.length ; i++) { System.out.println("Array[" + i + "] : " + arrays[i]); } } public static void mergeSort(int[] arr, int p, int r) { int q = 0; if ( p < r ) { q = (int)((p + r)/2); mergeSort(arr, p, q); mergeSort(arr, q+1, r); merge(arr, p, q, r); } } public static void merge(int[] arr, int p, int q, int r) { int n1 = q-p+1; int n2 = r-q; q++; int[] L = new int[n1+1]; int[] R = new int[n2+1]; int i =0; int j = 0; for ( i=0; i < L.length-1 ; i++ ) { L[i] = arr[p+i]; } for ( j=0; j < R.length-1 ; j++ ) { R[j] = arr[q+j]; } L[n1] = Integer.MAX_VALUE; R[n2] = Integer.MAX_VALUE; i = 0; j = 0; for ( int k = p ; k <= r ; k++ ) { if ( L[i] <= R[j] ) { arr[k] = L[i]; i++; } else { arr[k] = R[j]; j++; } } } }결론
최신 콘텐츠