[백준] 2751번 : 수 정렬하기 2

업데이트:

문제

N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.







입력

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.







출력

첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.





예제 입력 1

5
5
4
3
2
1

예제 출력 1

1
2
3
4
5







알고리즘 [ 접근방법 ]

단순 오름차순 정렬문제이지만 N의 범위가 1<=N<=1,000,000 으로 설정되어 있으므로 N을 배열에 넣기에는 너무 크다. 따라서 이중포문을 활용한 단순한 bubble sort로는 풀 수 없다. 이는 Divide and Conquer 방식을 활용한 Merge Sort로 풀어야 한다. Merge Sort에 대한 자세한 설명은 추후에 다른 게시물을 통해 업로드 후 링크를 걸어두겠다.







풀이

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

// 배열을 합치기 위한 함수
void merge(int* arr, int left, int mid, int right) {

	int* temp = (int*)malloc(sizeof(int) * (right - left + 1));
	int i = left;
	int j = mid + 1;
	int k = 0;

	while (i <= mid && j <= right) {
		if (arr[i] <= arr[j]) temp[k++] = arr[i++];
		else temp[k++] = arr[j++];
	}

	while (i <= mid) temp[k++] = arr[i++];

	while (j <= right) temp[k++] = arr[j++];

	i = left;
	k = 0;

	while (i <= right) arr[i++] = temp[k++];

	free(temp);
}

void mergeSort(int* arr, int left, int right) {
	if (left < right) {
		int mid = (left + right) / 2;
		mergeSort(arr, left, mid);
		mergeSort(arr, mid + 1, right);
		merge(arr, left, mid, right);
	}
}


int main() {
	int n = 0;
	scanf("%d", &n);

	int* pArr = (int*)malloc(sizeof(int) * n);

	for (int i = 0; i < n; i++) {
		scanf("%d", &pArr[i]);
	}

	// 배열 시작부터 끝까지 mergesort실행
	mergeSort(pArr, 0, n - 1);

	for (int i = 0; i < n; i++) {
		printf("%d\n", pArr[i]);
	}

	free(pArr);
	return 0;
}

댓글남기기