情報のテストがあるのでソートのところの解説を作りました
間違いがあればコメントとかで指摘してください
ところで、ここで書いてるプログラムは教科書とかと同じのにしたんですけど
配列を後ろから見てるの分かりにくくないですかね
あとなんで降順なんだろう
あとfor i in range()
も個人的には分かりにくい
ソートとは何か
ここでいうソートとは、「与えられた配列を一定の規則に従って並び替えること」です
今回は、
「任意個の整数がの配列」を「先頭ほど大きく、末尾ほど小さく」なるように並び替えます
交換法(バブルソート)
バブルソートは棒がどんどん横にスライドしていくので
横にすると気泡が上っていくように見えます
アイデア
プログラム
コードの挙動とは逆になっているところがあるけど本質は同じなので、分かりやすいアニメーションあるので載せておきます
(これは昇順のアニメーションです)
(プログラムでは左に行くほど大きくなって、赤枠も右から左に動きます)
赤枠は、プログラムのjとj+1で、現在着目している場所を示しています
赤枠内が逆になっていたら入れ替えをし、赤枠をずらしながら配列全体を確認しています
黒枠は、値が確定した場所です
黒枠がどこで誕生するか(どこで値が確定するか)確認すると、赤枠が端から端まで動いて終わったあと、右端が黒枠にしていることが分かります
これは、赤枠が移動していく途中で出会った、より大きい値を右へ動かしているからです
この黒枠は、プログラムでは配列の0からi-1までに該当します
確定した場所はもう確認する必要がないので、i-1の手前で処理を打ち切っています
説明付きのコード
a = [5,9,2,48,63,5,78,6,50] # 並び替える配列
n = len(a) # 配列の長さ
for i in range(0,n-1,1): # 並び替え完了まで周回する (n-1回)
for j in range(n-2,i-1,-1): # 配列を一周する (n-2からi-1まで)
if a[j] < a[j+1]: # 入れ替えるかを判断 (a[j]とa[j+1]の大小関係)
# 順番が違うとき
# a[j]とa[j+1]を入れ替える
temp = a[j]
a[j] = a[j+1]
a[j+1] = temp
日本語だけ
並び替える配列がa
配列の長さがn
並び替え完了まで以下を周回
配列を一周する
j番目とj+1番目を比較して、入れ替えるかを判断
j番目とj+1番目を入れ替える
又は
何もしない