본문 바로가기
알고리즘/BAEKJOON

BOJ 2751 : 수 정렬하기 2

by 피로물든딸기 2021. 2. 16.
반응형

알고리즘 문제 전체 링크

 

www.acmicpc.net/problem/2751

 

참고

- 머지 소트 Merge Sort

 

여러 정렬 방법이 있겠지만, 여기에서는 merge sort로 풀어보자.

#include <stdio.h>

int N;

int a[1000000 + 50000];
int b[1000000 + 50000];

void merge(int start, int end)
{
	int mid, i, j, k;

	mid = (start + end) >> 1;
	i = start;
	j = mid + 1;
	k = 0;

	while (i <= mid && j <= end)
	{
		if (a[i] <= a[j]) b[k++] = a[i++];
		else b[k++] = a[j++];
	}

	while (i <= mid) b[k++] = a[i++];
	while (j <= end) b[k++] = a[j++];

	for (i = start; i <= end;i++)
		a[i] = b[i - start];

}

void sort(int start, int end)
{
	int mid;
	if (start >= end) return;

	mid = (start + end) >> 1; 
    
	sort(start, mid);
	sort(mid + 1, end);
	merge(start, end);
}

int main(void)
{
	scanf("%d", &N);

	for (int i = 0; i < N;i++) scanf("%d", &a[i]);

	sort(0, N - 1);

	for (int i = 0; i < N;i++) printf("%d\n", a[i]);

	return 0;
}

 

아래는 merge에서 k = start, 마지막에 a[i] = b[i]로 수정하였다.

#include <stdio.h>

int N;

int a[1000000 + 50000];
int b[1000000 + 50000];

void merge(int start, int end)
{
	int mid, i, j, k;

	mid = (start + end) >> 1;
	i = start;
	j = mid + 1;
	k = start;

	while (i <= mid && j <= end)
	{
		if (a[i] <= a[j]) b[k++] = a[i++];
		else b[k++] = a[j++];
	}

	while (i <= mid) b[k++] = a[i++];
	while (j <= end) b[k++] = a[j++];

	for (i = start; i <= end; i++) a[i] = b[i];
}

void sort(int start, int end)
{
	int mid;
	if (start >= end) return;

	mid = (start + end) >> 1;
	sort(start, mid);
	sort(mid + 1, end);
	merge(start, end);
}

int main(void)
{
	scanf("%d", &N);

	for (int i = 0; i < N; i++) scanf("%d", &a[i]);

	sort(0, N - 1);

	for (int i = 0; i < N; i++) printf("%d\n", a[i]);

	return 0;
}
반응형

'알고리즘 > BAEKJOON' 카테고리의 다른 글

BOJ 15649 : N과 M (1) - 순열 permutation  (0) 2021.02.20
BOJ 11728 : 배열 합치기  (0) 2021.02.17
BOJ 14501, 15486 : 퇴사, 퇴사 2  (0) 2021.02.15
BOJ 10866 : 덱  (0) 2021.02.08
BOJ 10845, 18258 : 큐, 큐2  (0) 2021.02.07

댓글