基本情報 H27春午後問題8の解説

はじめに

こんにちは。Yuinaです🌰

今日は、基本情報技術者試験のクイックソートの問題(問題はこちら)を解いていきます。よろしくお願いいたします!

選択ソートのイメージを膨らませる☁️

クイックソートはpivotを基準に大きい値と小さい値をグループに分ける処理を行っています。

例として、A= [3,6,2,1,8,4,7,5]の配列を並べ替えていきましょう。

FindPivotメソッドには配列A,最小値Min,最大値Max,配列の中身(添字)を受け取るJが引数として渡されています。

Jが存在している場合、基準値であるPivotに配列AのJ番目の値を入れます。

そしてArrangeメソッドを呼び出し、並べ替えを行います。

一巡目のトレース図はこちらです↑

まだ並べ替えができそうですね。

次は配列を半分に分けて、並べ替えを行います。

配列Aは[3,2,1,4,6,8,7,5]なので、左側が[3,2,1]、右側が[4,6,7,5]ですね。

Pivotはそれぞれ2と6になるので、Arrange(A[],Min,Maax,Pivot,K)の”K”はPivotの新しい場所を示します。

そして、QuickSortの再起呼び出しを行います。

こんな感じでどんどんトレースしていきます。

イメージは膨らみましたか?☁️

過去問に挑戦しよう

さて、ここから問題を解いていきましょう!

まず、疑似言語をいくつかのブロックに分けて、処理の流れを理解していきます。


①TopとLastの初期化

TopとLastの初期化を行います。Topは0,Lastは6ですね。(疑似言語では、”開始値=1″です)

②Pivotと走査用変数の初期化

続いて、Pivotと配列の中の値の大きさを比べるための変数を初期化します。

iは左からの操作用変数で、jは右からの操作用変数です。

③走査

ここで、左右でPivot以上(or以下)はないかを走査します。

④走査終了

操作用変数(iとj)がすれ違った時点で、走査を終了します。

⑤交換

走査の結果から見つけた値同士を交換します。

そして操作用変数を次へ移動させます。

⑥走査範囲の更新

TOPとLASTの値を更新し、走査範囲を狭めていきます。


問題をトレースしたところ下記のようになりました。

1回目の処理

2回目の処理

よって、(a)はTOP=1,LAST= 5でア、(b)はTOP=2,LAST= 5でウが正解になります。


2回目の処理で pivot_pos=3 が目標 k=3 と一致したため、関数は終了し、x[3] の値 2 が返されます。よって、(c)の解はイです。

d は、Partition処理中の while True ループ内で要素が交換された回数です。

総交換回数=(1回目の交換)+(2回目の交換)=3+1=4回なので、(d)の解はエになります。

まとめ

疲れたので、今回の解説は設問2までにします。
ありがとうございました!

タイトルとURLをコピーしました