効率の良い交換法のアルゴリズム

学習の目的

  • ・効率の良い交換法のアルゴリズム

効率の良い交換法のアルゴリズム

交換法のアルゴリズムなのですが、もう少し効率の良い方法があります。

そんなことができるんですか?

とりあえず、さっき使ったアルゴリズム学習ツールを開いてください。

アルゴリズム学習ツールを再度開いてください。

閉じてしまった人は、次のリンクをクリックして、アルゴリズム学習ツールを開きなおしましょう。

それでは、以下の設定にしたがってスタートしてください。


実行してみて、どう感じましたか?

整列自体は、早い段階で完了していたのに、比較の処理はずっと続いていたね。

なんか、すっごい無駄なことをやっている気がするなぁ。

そうなんです。整列が完了しても、アルゴリズムの都合上比較を繰り返してしまうんです。

なるほど、それを解消するにはどうすればいいんですか?

整列が完了したと判断したら、繰り返しを終了するようにします。

一つの値を確定する流れで、一度も交換が発生しなかったら、繰り返しが完了していると判断します。

改善したフローチャートが、以下のものです。

そうか、一度も交換が発生しないということは、すべての隣同士が昇順になっているということ。

結果的に、すべて整列しているということになるのか。

その通りです。

それでは、改善したフローチャートが、以下のものです。

長くなったので、2列にしました。

さっきの交換法のプログラムと比べて、追加した部分を赤枠で囲み、番号をつけてあります。

追加した処理の内容を確認してみましょう。

① 変数flagの初期化

ここでは、変数flagの初期値として、1を格納します。

②の条件でflagを使用するため、繰返しの中に突入するための初期値となります。

② 繰返しの条件の変更

繰り返しの条件として、flag=1を追加します。

flagが1でない値なら、たとえ n の値がまだ残っていても繰り返しは終了することになります。

③ 変数flagの再設定

一つの要素を確定する「ループ2」に入る前に、変数flagに0を代入します。

④ 交換が発生した場合、flagに1を代入

一つの値を確定する流れで、交換が発生したらflagに1を代入します。

この処理によって、

「一度でも交換した」→ flag=1

「一度も交換しなかった」→ flag=0

と判断でき、一度も交換がなかったのであれば、②の条件が成立せずに、繰り返しを終了します。

なるほど!!

変数flagをうまく使って判断しているんですね。

それでは次にプログラムを見てみましょう。

Well done!

次のステップに進みましょう!

次のステップに進む

← 前のステップにもどる