情報36【電験3種 機械】n個の配列を降順に並べ替えるフローチャートと交換回数!令和2年度 B問題18 完全解説

電験3種 機械科目 情報 令和2年度 B問題18 降順に並べ替えるまで!何回入れ替わる?

今回は令和2年度 機械科目 B問題18を解説します。情報35(平成20年度B問題18)の図2と同一テーマ(配列降順ソート)の別年度・別記法版です。n個の配列a[n]を大きい順に並べ替えるフローチャートの空欄(ア)〜(ウ)を求める(a)と、n=5,a=[3,1,2,5,4]としたときに交換処理Xが何回行われるかを求める(b)の問題です。

(a)は判定条件と、退避用変数mを使った値交換の2ステップを穴埋めします。(b)は実際に5個の値を1回ずつ交換しながらトレースし、交換が発生した回数を数えるのが確実な方法です。

目次

令和2年度 機械科目 B問題18:問題文と選択肢

まずは、実際の試験問題を確認してみましょう。

電験3種 機械科目 情報 令和2年度 B問題18 問題文
令和2年度 機械科目 B問題18 問題文

出典:一般財団法人 電気技術者試験センター「令和2年度 第三種電気主任技術者試験」機械科目 B問題18

電験3種 機械科目 【情報】 令和2年度 B問題18

 図は,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)a[i]>a[j]a[j]←a[i]a[i]←m
(2)a[i]>a[j]a[i]←a[j]a[j]←m
(3)a[i]<a[j]a[j]←a[i]a[i]←m
(4)a[i]<a[j]a[j]←a[i]a[j]←m
(5)a[i]<a[j]a[i]←a[j]a[j]←m

(1)3 (2)5 (3)7 (4)8 (5)10〔回〕

図 n個の配列を降順に並べ替えるプログラムの流れ図(問題図)
図 n個の配列を降順に並べ替えるプログラムの流れ図(問題図)

出題のポイント:降順なら「左が小さいとき」交換

(a)は判定条件と交換処理の穴埋め——「どちらに並べたいか」から不等号の向きが決まります

空欄答え意味
(ア)a[i]<a[j]★降順なので、左が小さければ交換
(イ)a[i]←a[j]退避の後、右の値を左へ
(ウ)a[j]←m退避していた元の左の値を右へ

降順=大きい順——左のほうが大きくあるべきです。だから左が小さいときが「順序が逆」——そのとき交換します

値の交換は3ステップ

処理役割
m←a[i]★左の値を退避
a[i]←a[j]右の値を左へ(左は上書きされる)
a[j]←m退避した値を右へ

①を飛ばすと元の a[i] が消えてしまいます——「コップの水を入れ替えるには3つめのコップが要る」のと同じ。退避用の変数 m がその3つめです。

答え(a)の正解は (5)——(ア)a[i]<a[j] (イ)a[i]←a[j] (ウ)a[j]←m です。
図 n個の配列を降順に並べ替えるプログラムの流れ図(問題図)
図 n個の配列を降順に並べ替えるプログラムの流れ図(問題図)
降順ソートの比較条件aのi番目がaのj番目より小さい場合と一時変数mを使う3段階の交換処理図
a[i]<a[j]なら、m←a[i]、a[i]←a[j]、a[j]←mの順で安全に交換します。

(b) 交換が起きた回数を数える

問われているのは「Xを通った回数」=交換回数——比較回数ではありませんここが最大の落とし穴です。

ij比較交換配列
12〜53<1 ✕/3<2 ✕/3<5 ○/5<4 ✕1回[5,1,2,3,4]
23〜51<2 ○/2<3 ○/3<4 ○3回[5,4,1,2,3]
34〜51<2 ○/2<3 ○2回[5,4,3,1,2]
451<2 ○1回[5,4,3,2,1]

交換は 1+3+2+1=7回——一方、比較は 4+3+2+1=10回です。選択肢に10 が用意されているのは、この取り違えを狙ったものでしょう。

初期配列3 1 2 5 4から7回の交換後配列を順番に並べて降順完成を示す解答図
交換後だけを順に記録すると7回で[5,4,3,2,1]となり、(a)は(5)、(b)は(3)です。
答え(a)の正解は (5)、(b)の正解は (3) 7回です。

⚠️ よくある間違い
比較回数10 を答えてしまうのが最大の誤り——選択肢(5)がまさにその10 です。
設問は「Xで示される部分の処理は何回」——X は判定のYES側にある交換処理です。流れ図のどこにX があるかを最初に確認してください。
もう1つの誤りは、トレースを途中で省略すること——「だいたいこうなるはず」で進めると必ずずれます1行ずつ配列を書き写すのが結局は速いのです。

比較回数と交換回数の関係

比較回数は配列の中身によらず一定——交換回数だけが中身で変わります

二重ループの比較回数
\( \dfrac{n(n-1)}{2} \)

n=5 なら 5×4÷2=10回

配列の状態交換回数理由
すでに降順★0回a[i]<a[j] が一度も成立しない
本問([3,1,2,5,4])7回ばらばらの並び
完全な昇順10回(最大)すべての比較で交換

最悪でも比較回数と同じ10回——交換が比較を上回ることはありませんだから7 という答えは10 以下——検算の目安にもなります。

n が30 なら比較は435回——n2 に比例して増えることになります。データが10倍になれば時間は約100倍——これが単純な並べ替えの限界です。

⏱️ 本番での進め方
①(a) 降順なら「左が小さいとき」交換。(ア)はa[i]<a[j]。
②交換は退避→上書き→書き戻しの3ステップ。
③★(b)は交換回数。比較回数10 と混同しない。
④ i ごとに区切って数えると数え落としが防げる。

💡 覚え方
「降順なら左が小さいとき入れ替え」——並べたい向きの逆が交換条件そして「問われているのは比較か交換か」設問文で必ず確認してください。

同じ降順ソートが平成20年度 B問題18平成29年度 B問題18でも出題されています(平成20年度平成29年度)。

iごとの比較対象と比較回数、交換回数、各周回終了時の配列を示した二重ループの追跡表
比較は10回ですが、交換処理Xを通るのは1+3+2+1=7回です。

流れ図を読む3つの区画

どんな流れ図も、初期化・繰り返し・後処理の3区画に分けられます——まずこの目で全体を眺めると、構造がつかめます。

区画本問での内容
初期化n とa[1]〜a[n] の読み込み
繰り返し★二重ループ(i とj)で比較と交換
後処理並べ替えた配列の出力

本問で問われているのは、すべて繰り返しの中身——二重ループの内側にある判定と交換です。そこだけに集中すればよいと分かります。

二重ループの範囲

外側は i=1 から n−1 まで、内側は j=i+1 から n まで——j が i より後ろから始まるのが要点です。

ij の範囲比較回数
12〜54回
23〜53回
34〜52回
451回

同じ組を2度比べないための仕組み——j を i より後ろに限ることで、すべての組を1回ずつ調べられます

合計は 4+3+2+1=10回——これが n(n−1)/2 の正体です。1 から n−1 までの和になっています。

この方式は何をしているのか

外側のループが1周終わるたびに、a[i] にはそこから後ろで最大の値が入ります——だから先頭から順に確定していくのです。

i のループ終了時確定する値本問での値
i=1 の後★全体の最大値a[1]=5
i=2 の後2番目に大きい値a[2]=4
i=3 の後3番目a[3]=3
i=4 の後4番目と5番目a[4]=2、a[5]=1

「先頭を確定させてから、残りで同じことを繰り返す」——これが選択ソートの考え方です。トレースの途中経過を見れば、左から順に大きい値が並んでいくのが分かります。

この性質を知っていると、途中経過の検算ができます——i=1 が終わった時点で a[1] が最大値5 になっていなければ、どこかで間違えたということ。長いトレースの途中で確認できるのは大きな利点です。

まとめ

(a)(ア)a[i]<a[j]
(a)(イ)a[i]←a[j]
(a)(ウ)a[j]←m
初期配列[3,1,2,5,4]
(b) 交換回数7回
答え(a)-(5),(b)-(3)

▼あわせて解きたい関連問題
・30件の使用電力量データの最大値・平均値算出と降順ソート(平成20年度):【機械】平成20年度B問題18
・JK-FF3段の非同期式カウンタ回路とタイムチャート:【機械】平成26年度B問題18

📚 次に解くべき関連問題
【機械】平成20年度B問題18(情報35)
【機械】令和4年度下期B問題18(情報34)
【機械】令和4年度下期A問題13(情報39)
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次