병합 정렬은 여러 개의 정렬된 자료의 집합을 겹합하여 한 개의 정렬된 집합으로 만드는 정렬 방법이다. 병합 정렬은 전체 원소들에 대해서 수행하지 않고 부분집합으로 분할(Divide)하고 각 부분집합에 대해서 정렬 작업을 완성(Conquer)한 후에 정렬된 부분집합들을 다시 결합(Combine)하는 분할 정복(Divide and Conquer) 기법을 사용한다.

2개의 정렬된 자료 집합을 결합하여 하나의 집합으로 만드는 병합 방법을 2-way 병합이라 하고, n개의 정렬된 자료 집합을 결합하여 하나의 집합으로 만드는 병합 방법을 n-way병합이라고 한다.

2-way 병합 정렬은 다음과 갑ㅌ으 작업을 반복 수행하면서 완성한다.

1) 분할(Divide) : 자료들을 같은 크기의 부분집합 2개로 분할한다.

2) 정복(Conquer) : 부분집합에 있는 원소들을 정렬한다. 부분집합의 크기가 충분히 작지않으면 순환 호출을 이용하여 다시 분할한다.

3) 결합(Combine) : 정렬된 부분집합들을 하나의 집합으로 결합한다.


시간복잡도 : O(nlog2n)


public class mergeSort {

static int sorted[]=new int[30];

public static void main(String[] args) {

int a[]={69,10,30,2,16,8,31,22};

int size=a.length;

for(int i=0  ; i<a.length ; i++){

System.out.print(a[i]+" ");

}

System.out.println("\n");

mergesort(a,0,size-1);


}

public static void mergesort(int a[], int m, int n)

{

int middle;

if(m<n){

middle=(m+n)/2;

mergesort(a,m,middle);

mergesort(a,middle+1,n);

merge(a,m,middle,n);

}

}

public static void merge(int a[], int m, int middle, int n)

{

int i,j,k,t;

i=m;

j=middle+1;

k=m;

while(i<=middle&&j<=n){

if(a[i]<=a[j]){

sorted[k]=a[i];

i++;

}

else{

sorted[k]=a[j];

j++;

}

k++;

}

if(i>middle) for(t=j ; t<=n ; t++,k++) sorted[k]=a[t];

else for(t=i ; t<=middle ; t++,k++) sorted[k]=a[t];

for(t=m ; t<=n ; t++) a[t]=sorted[t];

for(int l=0  ; l<a.length ; l++){

System.out.print(a[l]+" ");

}

System.out.println("\n");

}


}

'Algorithm' 카테고리의 다른 글

순차 검색(Sequential Search)  (0) 2014.12.09
삽입 정렬(Insert Sort)  (0) 2014.12.02
퀵 정렬(Quick Sort)  (0) 2014.12.02
버블 정렬(Bubble Sort)  (0) 2014.12.02
선택 정렬(Selection Sort)  (0) 2014.12.02

+ Recent posts