基本情報技術者試験の科目Bの公開問題を題材に,クイックソートによる配列の整列について学習します。この問題では,基準値(pivot)を使って配列を分割し,左右から要素を探索する処理を確認します。
令和5年度 基本情報技術者試験 公開問題 科目B 問3
問 次の記述中の に入れる正しい答えを,解答群の中から選べ。ここで,配列の要素番号は1から始まる。
次の手続 sort は,大域の整数型の配列 data の,引数 first で与えられた要素番号から引数 last で与えられた要素番号までの要素を昇順に整列する。ここで,first < last とする。手続 sort を sort(1,5) として呼び出すと,/*** α ***/ の行を最初に実行したときの出力は “ ” となる。
〔プログラム〕
大域: 整数型の配列: data ← {2,1,3,5,4}
○sort(整数型: first,整数型: last)
整数型: pivot,i,j
pivot ← data[(first + last) ÷ 2 の商]
i ← first
j ← last
while (true)
while (data[i] < pivot)
i ← i + 1
endwhile
while (pivot < data[j])
j ← j - 1
endwhile
if (i ≧ j)
繰返し処理を終了する
endif
data[i]とdata[j]の値を入れ替える
i ← i + 1
j ← j - 1
endwhile
dataの全要素の値を要素番号の順に空白区切りで出力する /*** α ***/
if (first < i - 1)
sort(first,i - 1)
endif
if (j + 1 < last)
sort(j + 1,last)
endif
解答群
| ア 1 2 3 4 5 | イ 1 2 3 5 4 |
| ウ 2 1 3 4 5 | エ 2 1 3 5 4 |
【解答】エ
【解説】
sort は,クイックソートの処理を行う手続である。最初に,整列する範囲の中央の要素を pivot とする。sort(1,5) では,pivot = data[3] = 3 となる。左から pivot 以上の要素を探すと,data[3] = 3 で i = 3 となる。右から pivot 以下の要素を探すと,data[3] = 3 で j = 3 となる。このとき i = j = 3 なので,if文の条件「i ≧ j」が成立する。そのため,繰返し処理を終了し,data[i] と data[j] の交換も行われない。したがって,配列は {2,1,3,5,4} のままであり,/*** α ***/ の最初の出力は「2 1 3 5 4」となる。
この問題のポイント
この問題から学べることは,
- クイックソートの基本的な処理
- pivot を基準に配列を分割する方法
- iとjを使って左右から要素を探索する方法
- 繰返し処理を終了する条件の読み取り方
- 再帰的に部分配列を整列する方法
です。特に,i ≧ j が成立すると,その時点で繰返し処理を終了し,その後に書かれている要素の入替え処理は実行されないことを理解しておきましょう。
基本情報技術者試験の学習におすすめの参考書
基本情報技術者試験の合格を目指す方におすすめの参考書です。
学習のお役に立ちましたら
この記事が少しでも学習のお役に立ちましたら,今後も分かりやすい解説や学習コンテンツを継続してお届けする励みになります。
よろしければ、このサイトを応援いただけますと嬉しいです。
※OFUSEは,クリエイターやコンテンツ制作を直接支援できるサービスです。


