출처 | https://www.acmicpc.net/problem/2751
N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.
첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.
첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.
#include <stdio.h>
void merge(int a[], int low, int mid, int hight) //분리된 배열 정렬 및 병합 함수
{
int b[1000000];
int i = low; //왼쪽 시작
int j = mid + 1; //오른쪽 시작
int k = 0; //배열 b의 인덱스 값
while (i <= mid && j <= hight)
{
if (a[i] <= a[j]) //분리된 왼쪽 배열과 오른쪽 배열 비교
b[k++] = a[i++];
else
b[k++] = a[j++];
}
while (i <= mid) //비교하지 않은 왼쪽 배열이 있다면 배열 b에 전부 채우기
b[k++] = a[i++];
while (j <= hight) //비교하지 않은 오른쪽 배열이 있다면 배열 b에 전부 채우기
b[k++] = a[j++];
k--;
while (k >= 0) //배열 b 내용을 배열 a 내용에 덮어쓰기
{
a[low + k] = b[k];
k--;
}
}
void mergeSort(int a[], int low, int hight) //배열의 요소를 분할하는 함수
{
int mid;
if (low < hight)
{
mid = (low + hight) / 2;
mergeSort(a, low, mid); //왼쪽 배열의 요소 분리
mergeSort(a, mid + 1, hight); //오른쪽 배열의 요소 분리
merge(a, low, mid, hight); //분리된 배열 정렬 및 병합 함수
}
}
int main(void)
{
int arr[1000000];
int i, cnt; //cnt : 입력 횟수
scanf_s("%d", &cnt);
for (i = 0; i < cnt; i++)
scanf_s("%d", &arr[i]);
mergeSort(arr, 0, cnt - 1); //배열의 요소를 분할하는 함수
for (i = 0; i < cnt; i++)
printf("%d ", arr[i]);
}