Time Limit: 1s
Memory Limit: 128MB
합병 정렬 또는 병합 정렬(merge sort)은 일반적인 방법으로 구현했을 때 이 정렬은 안정 정렬에 속하며, 분할 정복 알고리즘의 하나이다.
합병 정렬은 다음과 같이 작동한다.
- 리스트의 길이가 1 이하이면 이미 정렬된 것으로 본다. 그렇지 않은 경우에는
- 분할(divide) : 정렬되지 않은 리스트를 절반으로 잘라 비슷한 크기의 두 부분 리스트로 나눈다.
- 정복(conquer) : 각 부분 리스트를 재귀적으로 합병 정렬을 이용해 정렬한다.
- 결합(combine) : 두 부분 리스트를 다시 하나의 정렬된 리스트로 합병한다. 이때 정렬 결과가 임시배열에 저장된다.
- 복사(copy) : 임시 배열에 저장된 결과를 원래 배열에 복사한다.
Merge sort로 정렬한 결과와 재귀함수 실행 횟수를 구해보자.
어떻게 나눠도 상관 없지만 이 문제에서는 배열의 길이가 홀수인 경우 배열의 첫 번째 요소부터 (배열의 길이-1)/2번째 요소까지, (배열의 길이+1)/2번째 요소부터 (배열의 길이)번째 요소까지 두 개로 나눈다.
* Line 1 : 정렬할 배열 갯수 N (1≤N≤1000)
* Line 2~N+1 : 배열 arr의 크기 n이 입력되고 그 뒤로 배열 arr의 원소들이 공백으로 구분되어 입력된다. (1 ≤ n ≤ 100, -2000 ≤ arr[i] ≤ 2000)
* Line 1~N : 정렬 중의 재귀함수 실행 횟수와 정렬 결과를 공백으로 구분하여 한 줄로 출력한다.
3 3 0 2 1 4 4 3 2 1 7 1 5 3 3 2 6 4
5 0 1 2 7 1 2 3 4 13 1 2 3 3 4 5 6
1회: {1, 5, 3, 3, 2, 6, 4} -> {1, 5, 3}{3, 2, 6, 4}
2회: {1, 5, 3} -> {1}{5, 3}
3회: {1}
4회: {5, 3} -> {5}{3}
5회: {5}
6회: {3}
-> {5}{3} -> {3, 5}
-> {1}{3, 5} -> {1, 3, 5}
7회: {3, 2, 6, 4} -> {3, 2}{6, 4}
8회: {3, 2} -> {3}{2}
9회: {3}
10회:{2}
-> {3}{2} -> {2, 3}
11회: {6, 4} ->{6}{4}
12회: {6}
13회: {4}
-> {4, 6}
-> {2, 3}{4, 6}->{2, 3, 4, 6}
-> {1, 3, 5}{2, 3, 4, 6}->{1, 2, 3, 3, 4, 5, 6}