File tree Expand file tree Collapse file tree 1 file changed +38
-0
lines changed Expand file tree Collapse file tree 1 file changed +38
-0
lines changed Original file line number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments