前項と同じような箇所も多くありますので、復習をするつもりで前項も確認しながら以下を読むことをお勧めします。
今回の前提条件は、読み込みの時点でn=5とし、次のa[1]~a[5]が最初は以下のような数値になっているものとします。これらを小さい順に並び替えるのが今回の主旨です。
- a[1]=2
- a[2]=3
- a[3]=8
- a[4]=6
- a[5]=5
上図のフローチャートのうち、青い枠線で書かれている部分は問題文には記載されないものと思って下さい。フローチャートを読み解く中で、必要に応じて自分で記入していく内容です。
では、これ以降で実際にフローチャートを読み解いていきます。
フローチャートを上から見ていくと、最初に「START」があって、次に配列が全部でn(上記の前提条件よりn=5)であることが示され、その5つの数値を読み込みます。5つの配列の内容は上記のとおり、a[1]=2、a[2]=3、a[3]=8、a[4]=6、a[5]=5とします。
このあとの「1→i」というのは、iに1を入れる、つまり「i=1」ということです。同様に、「i+1→j」は、「j=i+1」です。
ここで、ひし形で表される「判断」で、2つの数字の大小を比較します。最初の場合は、a[1]とa[2]の比較なので、2>3が正しいかどうかが問われています。その答えがYESなら下のXの部分に進み、NOならXをショートカットします。
Xの部分は「処理」が3つ連続であります。1つ目は「a[i]→m」なので、「mにa[i]を入れるのでm=a[i]になる」と読み替えることができます。2つ目は「a[j]→a[i]」なので、「a[i]にa[j]を入れるのでa[i]=a[j]になる」と読み取れます。3つ目は「m→a[j]」なので、「a[j]にmを入れるのでa[j]=mになる」という意味です。
結局、ここまでの3つの処理でやっているのは、a[i]とa[j]の値を交換しているということです。2つの値を直接入れ替えることはできないので、mを間にはさむことで数値の入れ替えをしています。
つまり、Xの直前に2つの大小を比べ、若い番号の配列(a[1]とa[2]ならa[1]のほう)の値が大きければ、Xにおいて2つの配列の中身の数値を入れ替えるという操作を行っています。一方、若い番号の配列の値が小さいなら、そのままにしておきます。
続いて、jを+1して、その値がn(=5)よりも大きいかどうか判断します。NOなら矢印に従って前に戻り(ただしjが+1されているため、戻ったあとの判断の結果は変わってきます)、YESなら下へと進みます。
ここでの意味合いは、5つの配列a[1]、a[2]、a[3]、a[4]、a[5]のうち、a[1]を固定して、a[2]との大小を比較、それが終わったらa[3]との比較、その次はa[4]との比較、最後にa[5]との比較…というような感じです。
a[i]は変えずにa[j]のjを1つずつ上げて、jは5が上限なので、そうなったら下に進んで今度はiを1つ上げます。
iを+1されたら、今度はiがn-1(=4)よりも大きいかどうかを判断します。つまり、a[2]に対して、今度はそれとa[3]と比較、a[4]と比較、a[5]と比較…というような感じです。そうしてiが上限の4(jの上限が5なのでiの上限は4)を超えたら、下へと進んで出力をします。
以上をまとめると、このフローチャートでは、2つの数値を比較して、左側のほうが右側よりも大きければ順序を入れ替えるという操作を、合計で10回行っています。ちなみに、10回という根拠は、5種類の数値を2つずつ比較するため、5C2=10という計算によるものです。
その結果、最終的に5つの配列は値の小さい順に並ぶことになります。
- a[1]とa[2]の比較
- a[1]とa[3]の比較
- a[1]とa[4]の比較
- a[1]とa[5]の比較
- a[2]とa[3]の比較
- a[2]とa[4]の比較
- a[2]とa[5]の比較
- a[3]とa[4]の比較
- a[3]とa[5]の比較
- a[4]とa[5]の比較
上記の1.~10.とフローチャートに書き込んだ①~⑩が連動しているので、確認してみてください。
以上が「数字の小さいものから並べる」ためのフローチャートの一例です。
同じ処理をするのでも上図以外の方法を取ることもできるため、このフローチャートを全て丸暗記をする必要はありません。図を見て何が起こっているかを読めることと、穴埋め問題などが出題されたときに適切な選択肢を選べるかどうかが重要となります。
コメント