問 題
図は、n個の配列の数値を大きい順(降順)に並べ替えるプログラムのフローチャートである。次の(a)及び(b)の問に答えよ。
(a) 図中の(ア)~(ウ)に当てはまる処理の組合せとして、正しいもの次の(1)~(5)のうちから一つ選べ。
- ア イ ウ
- a[i]>a[j] a[j]←a[i] a[i]←m
- a[i]>a[j] a[i]←a[j] a[j]←m
- a[i]<a[j] a[j]←a[i] a[i]←m
- a[i]<a[j] a[j]←a[i] a[j]←m
- a[i]<a[j] a[i]←a[j] a[j]←m
(b) このプログラム実行時の読込み処理において、n=5とし、a[1]=3、a[2]=1、a[3]=2、a[4]=5、a[5]=4とする。フローチャート中のXで示される部分の処理は何回行われるか、正しいものを次の(1)~(5)のうちから一つ選べ。
- 3
- 5
- 7
- 8
- 10
解 説
(a)
フローチャートを上から見ていくと、最初に「START」があって、次に配列が全部でn個であることが示され、そのn個の数値を読み込みます。
このあとの「i←1」というのは、iに1を入れる、つまり「i=1」ということです。同様に「j←i+1」は「j=i+1」なので、この流れだと「j=2」になります。
次に、ひし形で表される「判断」で、2つの数値の大小を比較します。このフローチャートの目的は数値を大きい順に並べることなので、2つの数値を比べてみた結果、正しい順序ならスルー、間違った順序なら数値を入れ替えるという操作がここで行われます。
比較条件は「(ア)」となっていて、選択肢を見るとa[i]とa[j]を比べることがわかります。上記の通り、jはiよりも1だけ大きい値なので、a[i]とa[j]の関係は、たとえば「1番目と2番目」や「4番目と5番目」といった関係となります。
最終的に大きい順に並べたいので、a[i]がa[j]より小さいと良くないので入れ替えが必要で、a[i]がa[j]より大きいなら理想的なので何も変える必要はありません。
ここでフローチャートを見ると、(ア)の直下にあるXの部分で数値の入れ替えを行っていると判断できるので、a[i]がa[j]より小さいならYESを進んでXで入れ替え処理をし、a[i]がa[j]より大きいならNO側からそのまま次に進めばよいことがわかります。
よって、(ア)では「a[i]がa[j]より小さいか?」という質問をすればよいことになるので、(ア)には「a[i]<a[j]」が入ります。
続いて、(イ)と(ウ)を含んだXの部分を見ていきます。
ここでは「処理」が3つ連続でありますが、やりたいことは上記の通り、a[i]とa[j]の値を交換することです。2つの値を直接入れ替えることはできないので、mを間にはさむことで数値の入れ替えをしています。
この流れ(フローチャートのX)は、次の通りです。
- まず、a[i]の値をmの値に代入します。これにより、a[i]の値をmという場所に仮置きすることができます。
- 次に、a[j]の値をa[i]の値に代入します。これによりa[i]の元の値は消えてしまいますが、mに仮置きしておいたので大丈夫です。
- 最後に、mの値をa[j]の値に代入します。mの値はもともとa[i]だった値です。
- 以上で、a[i]とa[j]の値が入れ替わります。
上記の流れから、(イ)には「a[i]←a[j]」が、(ウ)には「a[j]←m」が入ることがわかります。
もし(イ)で「a[j]←a[i]」としてしまうと、まだa[j]の元の値をどこにも保存していない状態で別の数値を上書きすることになるので、a[j]の元の値が消えてしまいます。
また、(ウ)に「a[i]←m」を入れた場合は、Xの1段階目「m←a[i]」を逆にしただけなので、a[i]は元の値がそのまま戻ってくることになり、a[j]との交換になりません。
以上から、正解は(5)となります。
(b)
まず、設問(a)ではフローチャートのうちXの部分までしか解説していないので、その前後からフローチャートの説明を続けます。
Xの直前では2つの大小を比べ、若い番号の配列(a[1]とa[2]ならa[1]のほう)の値が小さければ、Xにおいて2つの配列の中身の数値を入れ替えるという操作を行いました。一方、若い番号の配列の値が大きいなら、そのままにしておきます。
そしてXのあと、jを+1して、その値がn(設問(b)では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回行っています。その結果、最終的に5つの配列は値の大きい順に並ぶことになります。
ちなみに、10回という根拠は、5種類の数値を2つずつ比較するため、5C2=10からわかります。
- 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]の比較
以上の処理をまとめると、下表のようになります。青字のところは比較している数値です。青字同士で左側の値が小さければ、Xの処理を行います。また、Xの処理により数値を入れ替えたときは赤字で強調しています。
上表より、Xの処理は合計で7回行っているので、正解は(3)です。
コメント