Pythonでアルゴリズム「クイック・ソート」(6):右と左が衝突、もとい、すれ違う?
はい、今回もクイックソートの続きでございます!前回の記事では、ピボットの右と左にある値を交換するコードを確認しましたね。下の赤枠部分が行う処理です。
今度は、その下の続きに取り組みますよ~。While True内の最後の処理です。今回も図解しますよ!よし、行ってみよ~😄。
左と右が接近する!?
下図は、data[left]とdata[right]の交換が終わったところです。さて、上の赤枠の処理を行うとどうなるでしょうか?
「コード自体は簡単だな。leftが1つ増えて、rightが一つ減る🤔」
ですねえ。だとすると、Whileループの最後の処理後はこうなりますね。
「おお!leftとrightが近づいた!😆」
はい!この状態でWhile Trueのループをもう1回転させると次の通りです。3と7が交換されました。
そして、赤枠の処理をすると次の通りとなります。さらに、leftとrightが接近してきましたよ~!
leftが1つスキップ
「ちょっと待って。2番の値「4」はピボットより小さいな。🤔」
いいことに気が付きました!となると、次のループの左側の交換対象は、「4」ではなく、右隣りの「8」ですね。結果、「8」と「1」が交換されます。
そして、またleftが1つ増え、rightが1つ減るとこうなります。
「おお、隣り合った!😄」
ピボットが動いた!?
次のループでは、ピボットとLeftが持つ値がイコールなので、Leftは変更せず確定します。Rightもピボットより小さいので、そのまま確定です。となればleft「6」とright「5」の両者が交換されます。
あらよっと。こうなります。
「うお、ピボットの位置が変わった😮」
そう、ピボットも交換対象なんですよ。ピボットは、位置を表すのではなく、「値」を表していますからね。
これで、ピボットだった「6」の位置は確定しました。「6」は、もう移動しません。「6」の左には「6」より小さい値しかなく、「6」より右には「6」より大きい値しかないのですから。
「『6』にとっては、『6』自身以外の並びがどうなるか、なんてもう知ったことじゃないと?🤔」
そうですね~。イチあがり~といったところですね。
左と右がすれ違う!?
あ、ところで、その後処理が残っていましたね。
「ああ、左を増やして、右を増やすやつですね。」
はい、実行するとこうなります。
「ああ!leftとrightがすれ違った~😭」
そうなんです。もう新しいピボットを作らないことには、困ったことになりますね…。ループは、ループは果たして止まるのでしょうか?
それについては、次回ご紹介しましょう!
では、ビーダゼーン!
※私のやる気アップとブログの品質向上につながりますので、記事が気に入られた方は、「ポチっ」と好きボタンを押してくださったり、フォローいただけますと、私が喜びます!🙇。
この記事が気に入ったらサポートをしてみませんか?