演習課題「正しくマージソートを実装する」
整数nと要素数nの数列Aが与えられるので、この数列をマージソートでソートしてください。
右側のコードエリアに用意されているコードには誤りがあります。訂正し、問題を解くコードを完成させてください。
期待する出力値
1 2 3 8
4
※有料会員になるとこの動画をご利用いただけます
詳しい説明を読む
#05:マージソートの実装
実際にマージソートを実装してみます。関数の再帰を使うので、丁寧に実装しましょう。
n
A_1 A_2 ... A_n
・ 入力はすべて整数
・ 1行目に、数列の要素数nが与えられます。
・ 2行目に、数列の要素A_1,A_2,...,A_nが半角スペース区切りで与えられます。
INF = 1000000001
count = 0
def print_array(a):
print(*a)
def merge(a, left, mid, right):
global count
# それぞれの部分を新しい配列(リスト) l, r にコピー
l = a[left:mid]
r = a[mid:right]
# 番兵を追加
l.append(INF)
r.append(INF)
# lindex, rindex を 0 に初期化
lindex, rindex = 0, 0
for i in range(left, right):
# l と r の先頭要素のうち l の先頭要素が小さいなら
if l[lindex] < r[rindex]:
# l の先頭要素を元の配列(リスト)に格納
a[i] = l[lindex]
# l の先頭を 1 つ進める
lindex += 1
else:
# r の先頭要素を元の配列(リスト)に格納
a[i] = r[rindex]
# r の先頭を 1 つ進める
rindex += 1
count += 1
def merge_sort(a, left, right):
# もし、left が right-1 以上なら終了
if left >= right - 1:
return
# mid に (left+right)/2 を代入
mid = (left + right) // 2
# merge_sort(a, left, mid) と merge_sort(a, mid, right) を呼び出す
merge_sort(a, left, mid)
merge_sort(a, mid, right)
# merge(a, left, mid, right) を呼び出す
merge(a, left, mid, right)
n = int(input())
a = [int(x) for x in input().split()]
merge_sort(a, 0, n)
print_array(a)
print(count)
4
8 1 3 2
10
7 6 10 2 5 4 8 3 9 1
プログラミング学習
>
Python3
>
新・アルゴリズムとデータ構造入門 Python編
>
新・アルゴリズムとデータ構造入門 Python編5: 効率的なソートアルゴリズム
>
マージソートの実装
INF = 1000000001count = 0
コードの実行