2-2)[C] 병합 정렬(Merge Sort)

2021. 11. 8. 23:24·Algorithm/백준

1) 병합 정렬이란?

정렬하고 싶은 수열을 두 개의 수열로 분할해 간다. 더 이상 분할되지 않는 상태(즉, 각 그룹이 한 개의 숫자가 된 경우) 그룹들을 병합해 나간다. 병합할 때에는 정렬이 끝난 두 개의 수열을 병합해서 정렬이 끝난 하나의 수열로 만들고, 이것을 전체가 하나의 그룹이 될 때까지 반복한다.

 

2) 병합 정렬의 시간복잡도

병합 정렬에서 숫자를 분할해 갈 때는 계산 시간이 걸리지 않는다. 사실상 처음부터 분할된 상태라고 생각해도 무방하다. 

두 개의 정렬이 끝난 수열을 병합하는 부분은, 선두의 수를 비교해서 작은 쪽을 위로 올리는 것을 반복하는 것이 전부이므로 두 수열의 길이에 따라 달라진다. 따라서 하나의 층에서 병합 계산 시간은 그 층에 있는 숫자의 수가 된다.

어떤 층을 봐도 숫자는 n개 이므로 각 층의 계산 시간은 O(n)이 된다. 즉, 전체 계산 시간은 O(n log n)이다. 

 

3) 병합 정렬 구현

#include <stdio.h>

int num = 8;
int sorted[8]; // 정렬된 배열은 반드시 전역으로.

void merge(int a[], int m, int mid, int n) { // m:시작점, mid:중간점, n:끝점
	int i = m;
	int j = mid + 1;
	int k = m;
	// 작은 순서대로 배열에 삽입
	while (i <= mid && j <= n) {
		if (a[i] <= a[j]) {
			sorted[k] = a[i];
			i++;
		}
		else {
			sorted[k] = a[j];
			j++;
		}
		k++;
	}
	// 남은 데이터 삽입
	if (i > mid) {
		for (int p = j; p <= n; p++) {
			sorted[k] = a[p];
			k++;
		}
	}
	else {
		for (int p = i; p <= mid; p++) {
			sorted[k] = a[p];
			k++;
		}
	}
	// 정렬된 배열을 삽입
	for (int p = m; p <= n; p++) {
		a[p] = sorted[p];
	}
}
void mergeSort(int a[], int m, int n) { // 배열 나누는 과정
	// 크기가 1보다 큰 경우
	if (m < n) {
		int mid = (m + n) / 2;
		mergeSort(a, m, mid);
		mergeSort(a, mid + 1, n);
		merge(a, m, mid, n);
	}
}
int main() {
	int arr[8] = { 8, 2, 6, 5, 1, 4, 2, 7 };
	mergeSort(arr, 0, num - 1);
	for (int i = 0; i < num; i++) {
		printf("%d ", arr[i]);
	}
	return 0;
}

결과화면

1 2 3 4 5 6 7 8

 

 

 

반응형
'Algorithm/백준' 카테고리의 다른 글
  • 2-4) [C] 계수 정렬(Counting Sort)
  • 2-3) [C] 퀵정렬(Quick Sort)
  • 2-1) [C] 힙 정렬(Heap Sort)
  • 2-0) [C]힙(Heap)
수영하는 두루미
수영하는 두루미
한국체육대학교에서 스포츠 AI빅데이터를 공부하고 있습니다. B.S. Computer Science
  • 수영하는 두루미
    두루미의 스포츠 데이터분석실
    수영하는 두루미
  • 전체
    오늘
    어제
    • 분류 전체보기 (94)
      • 스포츠 AI·빅데이터(2024~) (21)
        • 2024-2 (0)
        • 빅데이터기반 스포츠경기분석 (10)
        • 스포츠와 소셜텍스트분석 (4)
        • 영상기반 데이터 수집기법 (3)
        • 2025-1 (0)
        • 스포츠와 AI 모델링 기초 (0)
        • 스포츠와 프로그램 코딩(Python) (0)
        • 운동역학 (0)
        • 2025-2 (0)
        • 스포츠 AI빅데이터 연구 세미나 (1)
        • 스포츠 딥러닝 (0)
        • 운동생리학 (0)
        • etc. (0)
      • Data (13)
        • ADsP (1)
        • SQLD (1)
        • 빅데이터분석기사 (4)
        • ADP(데이터분석 전문가) (5)
        • 키다리아저씨(2021.12.05~) (2)
        • 파이썬 자격과정(2021.07.22-23) (0)
      • 정보처리기사 (1)
      • CSTS (10)
      • 블록체인과 암호화폐 (0)
        • 블록체인 (0)
      • Algorithm (44)
        • 백준 (42)
        • 자료구조 (2)
      • CSOS (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    csts
    자료구조
    스포츠데이터
    경험기반테스트
    한체대
    알고리즘
    정적테스트
    Python
    C언어
    스포츠ai빅데이터
    동적테스트
    구조기반테스트
    데이터분석
    빅데이터분석기사
    백준
    스포츠빅데이터
    스포츠데이터분석
    한체대대학원
    명세기반테스트
    heapsort
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
수영하는 두루미
2-2)[C] 병합 정렬(Merge Sort)
상단으로

티스토리툴바