# 생각
merge sort를 이용하여 오름차순 정렬을 해볼 수 있다
# 전체 코드
#include <bits/stdc++.h>
using namespace std;
int n, arr[1111], tmp[1111];
// 두 배열의 맨 앞 인덱스끼리 값을 비교하며 더 작은 값을 순서대로 집어넣어 정렬
void mergeArray(int st, int en)
{
int mid = (st + en) / 2;
int l = st, r = mid;
for (int i = st; i < en; i++)
{
if (r == en) tmp[i] = arr[l++]; // index r이 끝에 도달했을 때
else if (l == mid) tmp[i] = arr[r++]; // inderx l이 끝에 도달했을 때
else if (arr[l] <= arr[r]) tmp[i] = arr[l++]; // ** l = r : stable sort **
else tmp[i] = arr[r++];
}
for (int i = st; i < en; i++) arr[i] = tmp[i];
}
void mergeSort(int st, int en)
{
if (en == st + 1) return; // 길이가 1인 경우
int mid = (st + en) / 2;
mergeSort(st, mid); // st ~ mid-1
mergeSort(mid, en); // mid ~ en-1
mergeArray(st, en); // st ~ mid, mid ~ en을 합친다
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int i = 0; i < n; i++) cin >> arr[i];
mergeSort(0, n);
for (int i = 0; i < n; i++) cout << arr[i] << '\n';
}
https://www.acmicpc.net/problem/2750
2750번: 수 정렬하기
첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.
www.acmicpc.net
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ] 1181_단어 정렬 with cpp (0) | 2022.02.28 |
---|---|
[BOJ] 2751_수 정렬하기 2 with cpp (0) | 2022.02.28 |
[BOJ] 18808_스티커 붙이기 with cpp (0) | 2022.02.21 |
[BOJ] 11651_좌표 정렬하기 2 with cpp (0) | 2022.02.20 |
[BOJ] 11650_좌표 정렬하기 with cpp (0) | 2022.02.19 |