8000 Create 2718.cpp · rinrin528/basic-algo-lecture@5111715 · GitHub
[go: up one dir, main page]

Skip to content

Commit 5111715

Browse files
Create 2718.cpp
1 parent 916b397 commit 5111715

File tree

1 file changed

+38
-0
lines changed

1 file changed

+38
-0
lines changed

0x0E/2718.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// http://boj.kr/31a6d300825e4e2f988c373ad91fccfe
2+
#include <bits/stdc++.h>
3+
using namespace std;
4+
5+
int arr[1000001];
6+
int tmp[1000001]; // merge 함수에서 리스트 2개를 합친 결과를 임시로 저장하고 있을 변수
7+
8+
// mid = (st+en)/2라고 할 때 a[st:mid], arr2[mid:en]은 이미 정렬이 되어있는 상태
9+
void merge(int st, int en){
10+
int mid = (st+en)/2;
11+
int lidx = st; // a[st:mid]에서 값을 보기 위해 사용하는 index
12+
int ridx = mid; // a[mid:en]에서 값을 보기 위해 사용하는 index
13+
for(int i = st; i < en; i++){
14+
if(ridx == en) tmp[i] = arr[lidx++];
15+
else if(lidx == mid) tmp[i] = arr[ridx++];
16+
else if(arr[lidx] <= arr[ridx]) tmp[i] = arr[lidx++];
17+
else tmp[i] = arr[ridx++];
18+
}
19+
for(int i = st; i < en; i++) arr[i] = tmp[i]; // tmp에 임시저장해둔 값을 a로 다시 옮김
20+
}
21+
22+
// a[st:en]을 정렬하고 싶다.
23+
void merge_sort(int st, int en){
24+
if(en-st == 1) return; // 길이 1인 경우
25+
int mid = (st+en)/2;
26+
merge_sort(st,mid); // st to mid-1을 정렬한다.
27+
merge_sort(mid,en); // mid to en-1을 정렬한다.
28+
merge(st,en);
29+
}
30+
int main(void){
31+
ios::sync_with_stdio(0);
32+
cin.tie(0);
33+
int n;
34+
cin >> n;
35+
for(int i = 0; i < n; i++) cin >> arr[i];
36+
merge_sort(0, n);
37+
for(int i = 0; i < n; i++) cout << arr[i] << '\n';
38+
}

0 commit comments

Comments
 (0)
0