Merge Sort

Updated:

강의 사이트
  • http://www.kocw.net/home/search/kemView.do?kemId=1148815

합병정렬(Merge Sort)

  • 분할 : 해결하고자 하는 문제를 작은 크기의 동일한 문제들로 분할
  • 정복 : 각각의 작은 문제를 순환적으로 해결
  • 합병 : 작은 문제의 해를 합하여(merge) 원래 문제에 대한 해를 구함

프로세스

  • 데이터가 저장된 배열을 절반으로 나눔
  • 각각을 순환적으로 정렬
  • 정렬된 두 개의 배열을 합쳐 전체를 정렬

  • 시간복잡도는 대략 O(logN * N)이다.

public class MergeSort {
	public static void main(String[] args) {
		int[] sort = new int[] {29, 10, 14, 37, 13};
		mergeSort(sort, 0, sort.length-1);
		printArray(sort);
	}

	private static void mergeSort(int[] sort, int i, int j) {
		//System.out.println(i + " " + j);
		if(i < j) {
			int r = (i+j) /2;
			mergeSort(sort, i, r);
			mergeSort(sort, r+1, j);
			merge(sort, i, r, j);
			printArray(sort);
		}
		
	}

	private static void merge(int[] sort, int i, int r, int j) {
		
		int[] temp = new int[sort.length];
		
		int x = i, y = r+1, z = i;
		
		while(x <= r && y <= j) {
			if(sort[x] > sort[y]) {
				temp[z++] = sort[y++];
			} else {
				temp[z++] = sort[x++];
			}
		}
		
		while(x <= r) {
			temp[z++] = sort[x++];
		}
		while(y <=j) {
			temp[z++] = sort[y++];
		}
		
		for(int t = i; t <=j; t++) {
			sort[t] = temp[t];
		}
	}

	private static void printArray(int[] sort) {
		for(int i = 0; i < sort.length; i++) {
			System.out.print(sort[i] + " ");
		}
		
		System.out.println();
	}
}