平成25年度 秋期 午前 問9
アルゴリズム
整列に関する問題
未整列の配列 a[i](i=1, 2, …, n)を,流れ図で示すアルゴリズムによって昇順に整列する。n=6 で a[1] 〜 a[6]の値がそれぞれ,21,5,53,71,3,17 の場合,流れ図において,a[j−1]と a[j]の値の入替えは何回行われるか。
〔流れ図〕
┌──────────┐
│ 開始 │
└────┬─────┘
╱────┴──────╲
│ ループ1 │ (注)ループ端の繰返し指定は,
│ i:1,1,n−1(注)│ 変数名:初期値,増分,終値
╲────┬──────╱ を示す。
╱────┴──────╲
│ ループ2 │
│ j:n,−1,i+1(注)│
╲────┬──────╱
│
╱────┴──────╲ No
⟨ a[j−1]>a[j] ⟩──────┐
╲────┬──────╱ │
│ Yes │
┌────┴─────────┐ │
│ a[j−1]と a[j]の値 │ │
│ を入れ替える │ │
└────┬─────────┘ │
├◀────────────────┘
╱────┴──────╲
│ ループ2 │
╲────┬──────╱
╱────┴──────╲
│ ループ1 │
╲────┬──────╱
┌────┴─────┐
│ 終了 │
└──────────┘- ア3
- イ6
- ウ8
- エ15
答えと解説を見る
✓ これが正解ウ8
解説
入替えの回数は、最初の配列にある逆順の対の個数と一致します。
設問は、流れ図で示した整列の手順を六つの値に当てたとき、隣り合う要素の入替えが何回起きるかを問うています。見る軸は二つで、内側のループが添字を下げながら進むことと、入替えが起きるのは隣り合う二つが逆順になっているときだけであることです。内側のループは注記のとおり増分がマイナス 1 なので、後ろから前へ向かって隣どうしを比べ、小さい値を前へ運びます。実際に 21、5、53、71、3、17 の並びで手順を追うと、外側の 1 巡目で 4 回、2 巡目で 3 回、3 巡目で 1 回の入替えが起き、4 巡目以降は条件が成り立たず、合計は 8 回です。最後の並びは 3、5、17、21、53、71 で昇順になっています。別の数え方でも当て直せます。隣り合う要素を一度交換すると、逆順になっている組はちょうど一つだけ減るので、入替えの総数は最初の並びにある逆順の組の個数に等しくなります。21 に対して 3 組、5 に対して 1 組、53 に対して 2 組、71 に対して 2 組で、合計はやはり 8 です。
ほかの選択肢はなぜ違うのか
- ア3:3 という値は、位置が動いた要素の個数など、交換そのものではないものを数えた形に見えます。外側の 1 巡目だけでもこれより多くの交換が起きるので、途中で数え終わっています。
- イ6:6 という値は、入替えをいくつか数え落としたときに出る形です。巡目ごとの累計は 1 巡目で 4 回、2 巡目までで 7 回、3 巡目までで 8 回と進むので、巡の区切りで数え終えても 6 にはならず、最後まで追えば 8 回になります。
- エ15:15 は比較の回数で、要素数 6 から 6 かける 5 を 2 で割って求まる値です。流れ図では比較のたびに入替えが起きるわけではないので、条件が成り立たなかった回を含んでしまいます。
この問題の用語
- アルゴリズム問題を解くための、決まった手順や考え方そのものです。同じ問題でも手順によって、処理にかかる時間や必要な記憶量が変わります。
出典:平成25年度 秋期 応用情報技術者試験 午前 問9
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)