[알고리즘] 문제풀이 연습

[알골90제] 62번 - 병합정렬 : 분할정복 (복습필수ㅠㅠ)

ddgoori 2019. 8. 2. 20:13

- 32번 복습하기

- 분할정복?

https://kugistory.net/76

 

분할정복법 (Divide and Conquer)

알고리즘 영역에서 분할정복법(Divide-and-Conquer)은 말 그대로 주어진 문제를 분할하여 해결하는 방법을 말한다. 즉, 한 번에 해결하기 어려운 문제를 작은 단위의 부문제들(subproblems)로 쪼개어 해결하는 방..

kugistory.net

https://gmlwjd9405.github.io/2018/05/08/algorithm-merge-sort.html

 

[알고리즘] 합병 정렬(merge sort)이란 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

*문제

병합정렬로 주어진 숫자들을 오름차순 하는 프로그램을 작성하세요.

 

*풀이

	//분할
	if (lt < rt) { //엇갈리면 멈춤
		mid = (lt + rt) / 2;
		divide(lt, mid);
		divide(mid+1, rt);
	}

 

 

- DFS: 후위순회이다! - 왼쪽 자식과 오른쪽 자식의 할일이 끝나면 루트를 한다.

 

// 62번 - 병합정렬 - 분할정복

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <algorithm>

int data[10], tmp[10];

void divide(int lt, int rt) { //lt, rt는 우리가 정렬하고자 하는 범위

	int mid;
	int p1, p2, p3;

	//분할
	if (lt < rt) { //엇갈리면 멈춤

		mid = (lt + rt) / 2;
		divide(lt, mid);
		divide(mid + 1, rt);

		p1 = lt;
		p2 = mid + 1;
		p3 = lt;

		while (p1 <= mid && p2 <= rt) {
			if (data[p1] < data[p2]) tmp[p3++] = data[p1++];
			else tmp[p3++] = data[p2++];
		}
		while (p1 <= mid) tmp[p3++] = data[p1++];
		while (p2 <= rt) tmp[p3++] = data[p2++];

		for (int i = lt; i <= rt; i++) {
			data[i] = tmp[i];
		}
	}
}

int main() {

	int n, i;

	scanf("%d", &n);
	for (int i = 1; i <= n;i++)
		scanf("%d", &data[i]);

	divide(1, n);

	for (int i = 1; i <= n; i++)
		printf("%d ", data[i]);



}