問題
図は,n個の配列の数値を大きい順(降順)に並べ替えるプログラムのフローチャートである。次の(a)及び(b)の問に答えよ。
(a)図中の(ア)〜(ウ)に当てはまる処理の組合せとして,正しいものを次の(1)〜(5)のうちから一つ選べ。
(b)このプログラム実行時の読込み処理において,n=5とし,a[1]=3,a[2]=1,a[3]=2,a[4]=5,a[5]=4とする。フローチャート中のXで示される部分の処理は何回行われるか,正しいものを次の(1)〜(5)のうちから一つ選べ。
(1)3 (2)5 (3)7 (4)8 (5)10
解説
(a)
問題の選択肢をみると,iとjは配列の要素の番号の変数として使われています。フローチャートをざっと眺めてみると,iとjはフローチャートの途中で「i ← i + 1」と「j ← j + 1」となっています。これは,iとjをそれぞれ1ずつ増やす処理であり,配列の要素の番号を順次変化させることで,配列に入っている数値を順番に調べていくための変数として使われています。
具体的にどのように配列に入っている数値を順番に調べていくのかは,フローチャートの(ア)から(ウ)の箇所に記載されています。
フローチャートの(ア)から(ウ)における処理は,配列に入っている数値を調べるだけではなく,調べた結果に基づき,それを大きい順に並べ替える処理をする箇所です。問題(a)はこの処理をどう記述するのが正しいのかを選択する問題です。
問題の選択肢の(ア)では,配列a[i]とa[j]の大きさの比較を行なっています。
フローチャートを見ると,iの最初の数値は1であり,jの最初の数字はiに1を加えたものですので2です。したがって,最初はa[1]とa[2]の大きさの比較から開始し,jが配列の全体の数であるnよりも小さい間はjが1つづつ増えていくため,それ以降は,a[1]とa[3],a[1]とa[4],a[1]とa[5]というように順次比較を行なっていきます。
配列a[i]とa[j]の大きさの比較を行なった結果,配列に入っている数値が大きい順になっていなければ,配列の値の入れ替えを行なっています。
このように隣合う配列を順に比較して並び替えを行う方法を「バブルソート」といいます。
バブルソートでは,隣り合う配列を順番に比較し,配列の中身の数字が大きい方を配列の若い番号の方に移動させていき,配列の中身の数字を大きい順に並べ替えます。
バブルソートのイメージをつかむため,以下に図を使って説明します。
最初に1番目の配列と2番目の配列を比較,その次に1番目の配列と3番目の配列を比較,その次に1番目と4番目の配列を比較します。
その後,2番目と3番目の比較,2番目と4番目の比較というように進んで行きます。
フローチャートで出てくる変数iとjは,iが上図のピンク,水色,緑のグループを変化させるための変数,jはそれぞれのグループの中で,比較する配列を順番に変化させるための変数として使われています。
以上を踏まえて,再び問題に戻ります。
フローチャートの(ア)は配列の数値の比較を行う箇所でした。
フローチャートをみると,(ア)での比較の結果,それがNO,すなわち比較の結果が正しくなければ,何もせずにjの数字を増やすだけの処理に進んでいます。
比較の結果が正しい,すなわちYESであれば,次の配列を入れ替えるための処理に進んでいます。配列の入れ替えが必要な場合というのは,2つの配列を比較したとき,若い番号の配列に入っている数字の方が小さい場合が該当します。若い番号はiの方ですので,a[i] < a[j]であれば,配列の入れ替え処理に進み,そうでなければ,そのままjの数字だけを増やす処理に進みます。
したがって,(ア)の選択肢として正しいのは,「a[i] < a[j]」ということになります。
フローチャートの(イ),(ウ)は配列を入れ替えるための処理です。
配列に入っている番号を若い番号の配列に入れ替える際に,いきなり若い番号の配列に数字を入れてしまうと,もともとその配列に入っていた数字を上書きしてしまうことになります。そのため,若い番号の配列に入っていた数値を一旦仮の変数にコピー(m←a[i])しておき,入れ替えた後に,その仮の変数に入っている数値を,後の配列に入れるという処理を行います。
言葉ではイメージしにくいと思いますので,上記処理を以下に図で示します。
(イ)の箇所の処理は上図では③の箇所に該当します。若い番号の配列にそれよりも後の番号の配列に入っている数字を入れる処理を行うため,「a[i] ← a[j]」という処理になります。
(ウ)の箇所の処理は上図では④の箇所に該当します。mに仮に保存しておいたa[i]の数字をa[j]に入れるための処理ですので,「a[j] ← m」という処理になります。
したがって解答は(5)になります。
(b)
Xで示される部分の処理というのは,問題(a)で説明したとおり,配列の入れ替えを行うための処理です。問題で与えられた配列を使って,実際に大きい順に並び替える処理を行なってみることで,この処理が何回行われるかを確認します。
最初の状態は問題で与えられた通りです。
a[1]=3,a[2]=1,a[3]=2,a[4]=5,a[5]=4
この状態から,a[1]とa[2],a[1]とa[3],a[1]とa[4],a[1]とa[5]という順に比較を行なっていきます。
配列の入れ替えが必要となるのは,a[1]とa[2]からa[5]をそれぞれ比較したときに,a[1]の方が値が小さい場合です。その条件に最初に該当するのは,a[1]とa[4]を比較したときですので,ここで配列の入れ替えが発生します。入れ替え後の配列の中身は以下のとおりとなります。
a[1]=5,a[2]=1,a[3]=2,a[4]=3,a[5]=4
この状態で,a[1]とa[5]の比較を行いますが,a[1]の方が値が大きので配列の入れ替えは必要ありません。
この状態のまま,次にa[2]とそれ以降の配列を順に比較します。この時点の配列の中身を再度以下に記載します。
a[1]=5,a[2]=1,a[3]=2,a[4]=3,a[5]=4
a[2]とa[3]の比較で,a[2]の方が値が小さいため,早速入れ替えが発生します。入れ替え後の配列の中身は以下のようになります。
a[1]=5,a[2]=2,a[3]=1,a[4]=3,a[5]=4
次に,a[2]とa[4]の比較を行いますが,ここでも入れ替えが発生します。入れ替え後の配列の中身は以下のとおりです。
a[1]=5,a[2]=3,a[3]=1,a[4]=2,a[5]=4
次に,a[2]とa[5]の比較を行いますが,ここでも入れ替えが必要です。入れ替え後の配列の中身は以下のとおりです。
a[1]=5,a[2]=4,a[3]=1,a[4]=2,a[5]=3
この状態で,次はa[3]とそれ以降の配列の比較を行います。
a[3]とa[4]の比較で,早速入れ替えが必要で,入れ替え後の配列の中身は以下のとおりになります。
a[1]=5,a[2]=4,a[3]=2,a[4]=1,a[5]=3
a[3]とa[5]の比較でも入れ替えが必要です。
a[1]=5,a[2]=4,a[3]=3,a[4]=1,a[5]=2
最後にa[4]とa[5]の比較を行いますが,ここでも入れ替えが必要となり,最終的な配列の中身は以下のとおりとなり,大き順に並び替えが完成します。
a[1]=5,a[2]=4,a[3]=3,a[4]=2,a[5]=1
上記のとおり,配列の入れ替えが必要となったのは,
a[1]とa[4]
a[2]とa[3],a[2]とa[4],a[2]とa[5]
a[3]とa[4],a[3]とa[5]
a[4]とa[5]
をそれぞれ比較したときでしたので,合計で7回です。したがって解答は(3)になります。
解答
(a)(5)
(b)(3)