반응형

개념

- 배열을 모두 반으로 쪼갠 후 나중에 두 집합을 묶어서 정렬하는 알고리즘(분할정복) 

- 각 부분 집합은 값이 완전히 정렬이 된 상태

- 기존의 데이터를 담을 추가적인 배열 공간이 필요하다는 점에서 비효율적

	static final int NUMBER = 8;
	int[] sortArray = new int[NUMBER];
	//배열 합치기
	void merge_array(int[] array, int start, int middle, int end) {
		System.out.println("\tstart merge_array");
		System.out.println("\t\tstart: "+start+" middle: "+middle+" end: "+end);
		int i = start;
		int k = start;
		int j = middle+1;
		//배열을 합칠 때, 각 부분 집합을 비교하여 가장 작은 값을 배열에 넣는다.
		while(i <= middle && j <= end) {
			if(array[i] <= array[j]) {
				sortArray[k] = array[i];
				i++;
			}else {
				sortArray[k] = array[j];
				j++;
			}
			k++;
		}
		//집합 중 하나가 먼저 정렬이 완료 된 상태라면, 나머지 집합의 남은 값도 배열에 넣는다.		
		if(i > middle) {
			for (int l=j; l<=j; l++) {
				sortArray[k] = array[l];
				k++;
			}
		}else {
			for (int l=i; l<= middle; l++) {
				sortArray[k] = array[l];
				k++;
			}
		}
		//임시로 저장해둔 값을 실제 정렬을 수행하는 배열로 이동 
		for (int l=start; l <= end; l++) {
			array[l] = sortArray[l];
		}
		System.out.println("\tend merge_array");
	}
	//배열 나누기
	void divide_array(int[] array, int start, int end) {
		System.out.println("divide_array start: "+start+" end: "+end);
		if( start < end ) {
			int middle = (start + end)/2;
			divide_array(array, start, middle);
			divide_array(array, middle+1, end);
			merge_array(array, start, middle, end);
		}
	}

 

시간복잡도 O(N*log N) 

퀵 정렬의 경우, 최악의 경우 O(N^2)이지만 병합정렬은 O(N*log N)을 보장한다. 

반응형

'Algorithm > 기본' 카테고리의 다른 글

힙 정렬(heap sort)  (0) 2021.05.06
계수 정렬(counting sort)  (0) 2021.05.04
퀵 정렬(quick sort)  (0) 2021.04.28
삽입 정렬(insertion sort)  (0) 2021.04.26
버블 정렬(bubble sort)  (0) 2021.04.25

+ Recent posts