
Pythonでアルゴリズム「挿入ソート」(6):偽になったら、そこで試合終了ですよ。
はい、こんにちは!さっそくう「挿入ソート」の内側ループの続きに行きましょう😆!

for文の詳細は、前回記事で確認しました。jの値が、「挿入する値の左隣り~0」まで変化するのでしたね。今回は、次のif文を考えてみましょう!
「大きい値」の皆様、どんどん右にお詰めくださ~い
カンタンにif文の全体を眺めましょう。その処理の形式は、双岐選択処理、つまり、ifが真のときも、偽の時も、それぞれ処理があるようですね。ただし、偽のときは、Breakが含まれるので、偽となったら処理後、内側ループは終了になります。
では、それも踏まえつつ、if文の前半を見てみます。if文の条件式は、「もしdata[j]の値が、tmpより大きいなら」と言っています。そして、真の時の処理内容は、「data[j]の値を、右隣りに移せ(代入せよ)」ですね。イメージ湧きます😅?

絵にすると下のとおりです(再掲)。tmpより2番の値は大きかったので、3番の位置に移動しました。

条件式が真である限りこれを繰り返します。整列済みエリアの値が、ぽいぽい右にずれていく感じです。
「小さい値」を発見して挿入位置が確定!
では、ついに「data[j]がtmpより大きい」という条件式を満たさくなった、つまり「data[j]がtmpより小さい(または同値)」となったら、どうしましょう?elseの内容を実行します

instは、「挿入する位置を格納する」ために宣言した変数でした。そこに、「j +1」を入れています。
「jにプラス1って、何でするんだっけ😅」
tmpより小さい値は、jの位置にあったんですよね。なら、jの右隣りにtmpの値を挿入しないといけないですね。
「なるほど!🙂」
絵で確認するとこんな感じです。画像上部に着目ください。0の位置にある6は、tmpより小さい(条件式が偽)ので、0の位置に+1して、「1」の位置にtmpが入ることを決定します。ただし、挿入する処理はまだですよ。

挿入位置を変数instに代入後、内側ループ処理は、breakにより終了します。「挿入位置を決める」という内側ループの役割は終わったのです(お疲れ様です…)。
外側ループの最後の処理として、tmpの値を整列済みエリアのしかるべき位置(左が小さく、右が大きい)に挿入します。


そして、リストを出力すれば、並べ替えが完了していることを確認できます。やったね~😄

はい、これでひと通り「挿入ソート」ができました~。いや~ちょっと手ごわかったな~。次は、どんなソート・アルゴリズムをやりますか。では、「挿入ソート」のパワーアップ版として、「シェル・ソート」をやろうかな。どうパワーアップするのでしょうね…。どうぞお楽しみに~。
あ、もう一度コードをはっておきますね。煮るなり焼くなり炒めるなりしてください🙂。
data = [9,6,10,8,7]
#「未整列エリア」の左端の値を「挿入する値」としてピックアップ
for i in range(1, len(data)):
#「挿入する値」をtmpに保存。iの位置は空きスペースになる。
tmp = data[i]
#挿入する位置を保持する変数を宣言。まずは0で初期化。
inst = 0
#「整列済エリア」の右端(i-1)から左端(0)まで繰り返す。
for j in range(i-1, -1, -1):
#その要素が、tmpよりも大きいなら、
if (tmp < data[j]):
#その値は、右隣りに移動(上書き)
data[j+1] = data[j]
#その要素が、tmpより小さいなら、
else:
#挿入する位置として、その要素の右隣り(j+1)を指定
inst = j + 1
#内側ループはストップ
break
#instの位置にtmpを挿入!「整列済エリア」の正しい位置に入った!
data[inst] = tmp
print(data)
では、ビーダゼーン!
※私のやる気アップとブログの品質向上につながりますので、記事が気に入られた方は、「ポチっ」と好きボタンを押してくださったり、フォローいただけますと幸いです🙇。