
Pythonでアルゴリズム「バブルソート」:外側ループ一つでも、奥が深い話
はい、では前回に引き続き、「バブルソート」に取り組みます!今回は、いよいよPythonでコードを書いてみますよ~。果たして、どんなコードなんでしょうね。
バブルソートのコードの全体像はこうだ!
先にコードのサンプルをお見せしましょう!こんな感じです。

変数dataに5つの値が、リスト形式で存在し、それをバブルソートした上で出力すると、きちんと昇順で並び替えられていることが分かります~。
「思ったよりもシンプルですね~😆」
でしょ!でも、、、一つ一つ見ていくと、「なんでこんな書き方になるの?」という疑問の「オンパレード」です💦。一つ一つコードを分析すればきっと意味が分かるはず!まずは、「外側のループ」からだ!
外側のループ:iは、決定したい値の添字?
データの部分の解説は省略します。話は核心に入ります。「外側のループ」です。このfor文について、一緒に考えましょう😆!

まず、「外側のループ」の目的って何でしたっけ?そう「左から右へ、小さい順に値を決めていく」ことでしたね。であるならば、for文のカウンタ変数iは、「ループで決定したい値の添字」になります。

外側のループで、0~3番の4つの値を順に確定させるできます。4番目は、3番目を確定させれば、勝手に確定します。
ということで、iは、「ループで決定したい値の添字」であることが分かりました。しかし、問題は、、、ループの継続条件ですねえ…。
カウンタは「データの個数ー2」まで増えていく?
ループが完了するたびに、iを「0,1,2,3」と変化させたいわけです。でも、下の図のような書き方で本当にそうなるのかしらん🤔?

悩んでないで、四の五の言わずに、調べてしまいましょうか!次のように、コードを書いて確認しました。for分の処理内容を書き換えて、ループに突入する都度、iの値が出力されるようにしたものです。

結果は上の通り。うん、「0,1,2,3」と変化していますね。バッチリでございます😆!でも、なんで「0,1,2,3」と変化するのでしょう?関数を分解すればきっと分かるはず!
len関数
まず、len(data)の戻り値は何でしょうか?はい、「5」ですね。len関数は、リストの要素数を戻してくる関数でしたね。
そこから、1を引いています。なぜ?
だって、一番最後の添字は確定させなくていいからです。一つ余計だから、一つ引いているわけですね。結局、range関数の引数は、「4」になっているはずです。
range関数
range関数は、値の連番を保持してくれる関数です。引数が一つのときは、「0以上、引数未満」の整数、でしたね。この「未満」というのがポイントです。引数の値は、0からの連番に含まれないのですよ!(リストの最後の値の添字は、「要素数-1」番なので、引数「未満」とすると、リストの最初から最後までループさせる時に都合がよいのですよ…。)
結果として、「0以上4未満の整数」すなわち、「0,1,2,3」が得られというわけです。
かくしてカウンタ変数iは、0~3までループの都度、変化することになります。
なるほど、分かった~😅!??
すみません。「外側のループ」の意味を理解するだけで、エネルギーを使い果たしてしまいました。for文一つで結構、奥が深いんだな~、と思います。「内側のループ」は次回以降にしましょう😄!
あ、コードはこちらです。
#データを用意する。
data = [6,9,10,8,5]
#iは、ループで確定する添字です。0~3まで1ずつ増加します。
for i in range(len(data) - 1):
#jの値は、天秤の右側の番号です。
#jは「4(リストの要素数-1)」~「iより1つ大きい番号(1~4)」まで変化します。
for j in range(len(data)-1, i, -1):
#右が小さいなら、値を交換します。
if data[j-1] > data[j]:
temp = data[j]
data[j] = data[j-1]
data[j-1] = temp
#結果を出力します。
print(data)
では、ビーダゼーン!
※私のやる気アップとブログの品質向上につながりますので、記事が気に入られた方は、「ポチっ」と好きボタンを押してくださったり、フォローいただけますと幸いです🙇。