본문 바로가기
알고리즘/자료구조(C)

병합 정렬(Merge Sort)

by 진진리 2023. 9. 22.
728x90
  • 병합 정렬(Merge sort)

배열을 앞부분과 뒷부분으로 나누어 각각 정렬한 후 둘을 병합하여 정렬하는 알고리즘

 

배열의 요소 개수가 2개 이상인 경우:

1. 앞부분을 병합 정렬로 정렬

2. 뒷부분을 병합 정렬로 정렬

3. 배열의 앞부분과 뒷부분을 병합 (두 배열의 요소를 하나씩 선택하여 비교한 후 작은 값을 대입)

 

#include <stdio.h>
#include <stdlib.h>

static int* buff;  //작업용 배열

static void __mergesort(int a[], int left, int right) {
	if (left < right) {
		int center = (left + right) / 2;
		int p = 0;
		int i;
		int j = 0;
		int k = left;
		__mergesort(a, left, center);
		__mergesort(a, center + 1, right);
		for (i = left; i <= center; i++) { //정렬된 앞부분을 buff에 저장
			buff[p++] = a[i];
		}
		while (i <= right && j < p) //뒷부분의 요소를 하나씩 앞부분과 비교해서 작은 것을 a에 추가
			a[k++] = (buff[j] <= a[i]) ? buff[j++] : a[i++];
		while (j < p) a[k++] = buff[j++]; //앞부분을 다 넣었으면 추가되지 못한 뒷부분의 요소를 순서대로 마저 추가
	}
}

int mergesort(int a[], int n) {
	if ((buff = calloc(n, sizeof(int))) == NULL) return -1;
	__mergesort(a, 0, n - 1);
	free(buff);
	return 0;
}

int main(void) {
	int i, nx;
	int* x;
	puts("병합 정렬");
	printf("요소 개수: ");
	scanf_s("%d", &nx);
	x = calloc(nx, sizeof(int));

	for (i = 0; i < nx; i++) {
		printf("x[%d]: ",i);
		scanf_s("%d", &x[i]);
	}

	mergesort(x, nx);
	puts("오름차순으로 정렬했습니다.");
	for (i = 0; i < nx; i++) printf("x[%d] = %d\n", i, x[i]);

	free(x);

	return 0;
}

 

시간복잡도: O(n log n) - best, avg, worst

'알고리즘 > 자료구조(C)' 카테고리의 다른 글

배열로 집합 만들기  (0) 2023.09.23
힙 정렬(Heap Sort)  (0) 2023.09.22
퀵 정렬(Quick Sort)  (0) 2023.09.22
삽입 정렬(Insertion Sort)  (0) 2023.09.22
선택 정렬(Selection Sort)  (0) 2023.09.22