交換法のアルゴリズムなのですが、もう少し効率の良い方法があります。
情報活用編プラス
第3章「コンピュータとプログラミング」
IP02-10
実践プログラム③ 整列アルゴリズム 交換法
効率の良い交換法のアルゴリズム
学習の目的
・効率の良い交換法のアルゴリズム
効率の良い交換法のアルゴリズム
そんなことができるんですか?
とりあえず、さっき使ったアルゴリズム学習ツールを開いてください。
アルゴリズム学習ツールを再度開いてください。
閉じてしまった人は、次のリンクをクリックして、アルゴリズム学習ツールを開きなおしましょう。
それでは、以下の設定にしたがってスタートしてください。
実行してみて、どう感じましたか?
整列自体は、早い段階で完了していたのに、比較の処理はずっと続いていたね。
なんか、すっごい無駄なことをやっている気がするなぁ。
そうなんです。整列が完了しても、アルゴリズムの都合上比較を繰り返してしまうんです。
なるほど、それを解消するにはどうすればいいんですか?
整列が完了したと判断したら、繰り返しを終了するようにします。
一つの値を確定する流れで、一度も交換が発生しなかったら、繰り返しが完了していると判断します。
改善したフローチャートが、以下のものです。
そうか、一度も交換が発生しないということは、すべての隣同士が昇順になっているということ。
結果的に、すべて整列しているということになるのか。
その通りです。
それでは、改善したフローチャートが、以下のものです。
長くなったので、2列にしました。
さっきの交換法のプログラムと比べて、追加した部分を赤枠で囲み、番号をつけてあります。
追加した処理の内容を確認してみましょう。
① 変数flagの初期化
ここでは、変数flagの初期値として、1を格納します。
②の条件でflagを使用するため、繰返しの中に突入するための初期値となります。
② 繰返しの条件の変更
繰り返しの条件として、flag=1を追加します。
flagが1でない値なら、たとえ n の値がまだ残っていても繰り返しは終了することになります。
③ 変数flagの再設定
一つの要素を確定する「ループ2」に入る前に、変数flagに0を代入します。
④ 交換が発生した場合、flagに1を代入
一つの値を確定する流れで、交換が発生したらflagに1を代入します。
この処理によって、
「一度でも交換した」→ flag=1
「一度も交換しなかった」→ flag=0
と判断でき、一度も交換がなかったのであれば、②の条件が成立せずに、繰り返しを終了します。
なるほど!!
変数flagをうまく使って判断しているんですね。
それでは次にプログラムを見てみましょう。