1. MergeSort 개요
- 입력을 분할한다.
- 각 Partion 에 대해 다시 Sort 한다.
- Sort 된 Partion 에서 가장 작은 값을 먼저 저장한다.
2. 기본 알고리즘
MergeSort (A, p, q)
{
if( p == q)
return ;
middle= (p+q)/2;
MergeSort (p,middle);
MergeSort (middle+1, q);
Merge(A,p,q,middle);
}
Merge(A,p,q,middle)
{
leftIdx=0, rigthIdx=0, idx = 0 ;
for i=p to middle
tmpLef[idx++]=A[i];
tmpLeft[idx]=MAX;
for i=middle to q
tmpRight[idx++]=A[i];
tmpRight[idx]=MAX;
for i=p to q
if(tmpLeft[leftIdx] < tmpRight[rightIdx])
A[i] = tmpLeft[leftIdx++];
else
A[i] = tmpRight[rightIdx++];
}
3. 구현
private void mergeSort(int[] A, int p, int q) { if (p == q) { return ; } int middle = (p+q)/2; mergeSort(A, p,middle); mergeSort(A, middle+1, q); merge(A, p,q, middle); } private void merge(int[]A, int p, int q, int m) { int i ; int[] tmpLeft = new int[m-p+1+1]; // m 포함 int[] tmpRight = new int[q-m+1]; //m 미포함 for( i = 0 ; i < tmpLeft.length-1 ; i++) { tmpLeft[i] = A[p+i]; } tmpLeft[i] = Integer.MAX_VALUE; for( i = 0 ; i < tmpRight.length-1 ; i++) { tmpRight[i] = A[m+1+i]; } tmpRight[i] = Integer.MAX_VALUE; int leftIdx = 0; int rightIdx = 0; for ( i =p ; i <= q; i++) { if( tmpLeft[leftIdx] <= tmpRight[rightIdx] ) { A[i] = tmpLeft[leftIdx++] ; } else{ A[i] = tmpRight[rightIdx++] ; } } }
'Programming > Algorithm' 카테고리의 다른 글
기본 알고리즘 - HeapSort (0) | 2015.02.05 |
---|---|
기본 알고리즘 - Quick Sort (0) | 2015.01.31 |
기본 Sort 알고리즘 InsertionSort (0) | 2015.01.21 |
기본 Sort 알고리즘 - BubleSort (0) | 2015.01.20 |
기본 Sort 알고리즘 - 선택정렬 (0) | 2015.01.18 |