
【基本情報】配列とループのつまずき解消|隣同士の交換を1周ずつ追う
配列の交換を1回なら追える。でも、ループに入ると「今の配列」が分からなくなる。
そんなときは、変数の表とは別に、交換後の配列全体を書いてみましょう。今回は4個の数を使い、隣同士の比較と交換を実演します。全文無料のオリジナル基礎演習です📚
1.この処理で配列はどう変わる?
配列aは{6, 2, 5, 1}。配列は1始まり、forの終点は含み、←は代入です。型宣言などを省いた学習用表記を使います。
for (i を 1 から 3 まで 1 ずつ増やす)
if (a[i] が a[i + 1] より大きい)
temp ← a[i]
a[i] ← a[i + 1]
a[i + 1] ← temp
endif
endfor最後の配列を、解説を見る前に書いてください。「1回の比較ごとに何が動いたか」が今回の確認ポイントです。
2.同じ6が、右へ移動していく
最初:{6, 2, 5, 1}
i=1:6と2を比較。6>2なので交換し、{2, 6, 5, 1}。
i=2:比較するのは、更新後のa[2]=6とa[3]=5です。交換して{2, 5, 6, 1}。
i=3:6と1を比較して交換。最後は{2, 5, 1, 6}です。
i=2のとき、最初の配列にあったa[2]=2を使わないことが大切です。代入で配列が変わったら、以降は新しい状態を使います。
3.tempを使わずに交換できる?
a[i]←a[i+1]だけを先に実行すると、元のa[i]が上書きされます。その後a[i+1]←a[i]としても、両方が同じ値になります。
最初の6と2なら、tempへ6を退避→左へ2を入れる→右へ退避した6を戻す、の3段階です。「代入は同時ではなく、上から順に起きる」と考えます。
4.1周で、全部が並ぶわけではない
今回の1周では、最大値6が右端へ移りました。ただし{2, 5, 1}はまだ昇順ではありません。
隣同士の比較と交換を繰り返すバブルソートにつながる処理ですが、このコードは1周分だけです。完成した整列処理と取り違えないようにしましょう。
またiの最後を4にすると、a[5]を参照してしまいます。4要素で隣のi+1まで読むため、iは3までです。
5.確認問題
問1:{2, 5, 1, 6}に同じコードをもう一度実行すると、最後の配列は? 交換回数も答えてください。
問2:最初から{1, 2, 5, 6}なら、比較は何回、交換は何回?
問3:5要素の配列で、同じように先頭から隣同士を比較するとき、範囲外を読まない最後のiはいくつ?
6.解答と解説
問1:{2, 1, 5, 6}、交換は1回。2>5は偽、5>1は真なので交換、最後の5>6は偽です。交換がない比較も実行されています。
問2:比較3回、交換0回です。配列が既に整列済みでも、このコードには途中終了の仕組みがないため、3組を比較します。
問3:i=4です。i+1=5まで読めます。最後の要素番号そのものを、iの終点にしないよう確認します。
復習するときは「比較回数」と「交換回数」を別々にメモしてください。答えだけ合っても、途中の配列を書けなければ、別の初期値でもう一度追ってみましょう。
7.配列から探索・整列へ広げるなら
既存の 科目B・擬似言語 完全攻略(有料記事・無料部分あり) で収録内容を確認できます。説明との相性を無料部分で確かめてからお選びください。購入済みなら、まずその教材の配列・アルゴリズムの復習に活用してください。重複購入は不要です。
表記の確認:IPA 科目Bサンプル問題。本記事のコード・問題は独自に作成しています。
次の確認|交換が起きない比較も数える
配列を{3, 1, 2, 4}として、本文の1周分の処理を実行してください。最後の配列、比較回数、交換回数は?
ここで解答を見ずに、答えと理由を紙へ書いてください。
解答:{1, 2, 3, 4}、比較3回・交換2回です。3と1、次に3と2を交換し、3と4は交換しません。
配列の更新から探索・整列へ練習を広げたい場合は、対応教材の無料部分・到達点・FAQを確認してください。無料の問題だけで手順を説明できれば、まず手持ちの教材で続けられます。購入済み・加入中の教材で読める内容は買い直し不要です。