マージソート(Merge Sort)は分割統治法に基づく高速なアルゴリズムで、次のように実装することができます。
merge(A, left, mid, right) n1 = mid - left; n2 = right - mid; L[0...n1], R[0...n2] を生成 for i = 0 to n1-1 L[i] = A[left + i] for i = 0 to n2-1 R[i] = A[mid + i] L[n1] = INFTY R[n2] = INFTY i = 0 j = 0 for k = left to right-1 if L[i] <= R[j] A[k] = L[i] i = i + 1 else A[k] = R[j] j = j + 1 mergeSort(A, left, right) if left+1 < right mid = (left + right)/2; mergeSort(A, left, mid) mergeSort(A, mid, right) merge(A, left, mid, right)
$n$ 個の整数を含む数列 $S$ を上の疑似コードに従ったマージソートで昇順に整列するプログラムを作成してください。また、mergeにおける比較回数の総数を報告してください。
1行目に $n$、2行目に $S$ を表す $n$ 個の整数が与えられます。
1行目に整列済みの数列 $S$ を出力してください。数列の隣り合う要素は1つの空白で区切ってください。2行目に比較回数を出力してください。
10 8 5 9 2 6 3 7 1 10 4
1 2 3 4 5 6 7 8 9 10 34