C언어 알고리즘 정리 및 실무 프로젝트

C언어의 병합정렬 (merge_sort) 알고리즘 본문

C언어 알고리즘

C언어의 병합정렬 (merge_sort) 알고리즘

C's everything! 2022. 6. 25. 23:09
반응형

초보자분들이 이해하시기에는 어려운 정렬 방법입니다. 

이 블로그에 있는 (선택, 삽입, 버블, 셀 정렬)을 먼저 이해하신 뒤에 보시는 것을 추천드립니다.

장점: 다른 정렬방법보다 수행 속도가 빠르고 효율적이다.

단점: 퀵 정렬과 다르게 <stdlib.h>에 구현되어 있지 않아서 직접 코드를 짜야 하는 불편함이 있다.

사용 방법: merge_sort(원본 배열,    정렬되어 저장될 배열,     첫 번째 인덱스,    마지막 인덱스)

void merge(int a[], int b[], int left, int right) {	// 병합 (분할된 세트를 정렬하면서 합침.)
	
	
	int l = left;	// 왼쪽 집합의 시작점
	int mid = (left + right) / 2;	// 왼쪽 집합의 마지막 지점
	int j = mid + 1;	// 오른쪽 집합의 시작점

	int compare = left;	// 정렬된 값을 b에 대입하기 위한 변수

	while (l <= mid && j <= right) {

		if (a[l] > a[j])	// 오른쪽이 더 작을 때 (바꿔서 저장)
			b[compare++] = a[j++];	// 오른쪽 값을 왼쪽에 저장
		
		else				// 왼쪽이 더 작을 때 (그대로 둠)
			b[compare++] = a[l++];	// 왼쪽 값을 왼쪽에 저장
	}


	while (l <= mid) {	// 중간보다 작을 때, 계속 돌아감.
		b[compare++] = a[l++];	// 아직 들어가지 않은 값을 마저 넣어줌.
	}


	while (j <= right){	// 끝보다 작을 때, 계속 돌아감.
		b[compare++] = a[j++];	// 아직 들어가지 않은 값을 마저 넣어줌.
	}

	for (int i = left; i <= right; i++)
		a[i] = b[i];	// 전체 요소를 돌면서 바뀐 값을 a에도 적용시켜준다.
	
}

void merge_sort(int a[], int b[], int left, int right) {	// 분할(작은 세트로 쪼갬) 및 병합
	
	int mid;	// 배열의 중간
	
	if(left < right) {
		
		// 0,1   2,3
		mid = (left + right) / 2;	// 중간 지점
		merge_sort(a, b, left, mid);		// 중간을 기준으로 왼쪽 분할
		merge_sort(a, b, mid + 1, right);	// 중간을 기준으로 오른쪽 분할
		merge(a, b, left, right);	// 왼쪽과 오른쪽을 정렬한 후 병합
	}
	
}
반응형
Comments