見出し画像

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) 

では、ビーダゼーン!

※私のやる気アップとブログの品質向上につながりますので、記事が気に入られた方は、「ポチっ」と好きボタンを押してくださったり、フォローいただけますと幸いです🙇。

いいなと思ったら応援しよう!