プログラムの1行目で要求されている引数を用意します。 
まずはプログラムに入力する数値を集めます。
このプログラムは1行目で x[ ]、n、k を要求しています。
すべて揃わないとプログラムは動作しません。
設問1の値を利用します。
| x[1 2 3 4 5 6 7] | n | k | 
|---|---|---|
| 3 5 6 4 7 2 1 | 7 | 3 | 
初期値を設定します。
3行目 Top←1
4行目 Last←n なので Last は 7
| Top | Last | 
|---|---|
| 1 | 7 | 
6行目 Pivot←x[k] なので Pivot は 6
7行目 i←Top なので i は 1
8行目 j←Last なので j は 7
| x[1 2 3 4 5 6 7] | Pivot | i | j | 
|---|---|---|---|
| 3 5 6 4 7 2 1 | 6 | 1 | 7 | 
1回目
10行目で X[1] すなわち 3 と Pivot すなわち 6 を比べるのですがこれは頭の中で行います。
結果はTrueです。
11行目 i←i + 1 は書き換えなので表に書き込みます。
| x[1 2 3 4 5 6 7] | Pivot | i | j | 
|---|---|---|---|
| 3 5 6 4 7 2 1 | 6 | 7 | 2 | 
10行目に戻って x[2] すなわち 5 と Pivot すなわち 6 を比べます。
Trueなので i を書き換えます。
| x[1 2 3 4 5 6 7] | Pivot | i | j | 
|---|---|---|---|
| 3 5 6 4 7 2 1 | 6 | 7 | |
| 3 | 
10行目に戻って x[3] と Pivot を比べます。
Falseなのでループを抜けます。
13行目 Pivot と x[7] を比べます。
Falseなのでループを抜けます。
16行目はFalseなので17行目は実行しません。
19から21行目は三角交換です。
x[ i ] と x[ j ] を交換します。
書き換えなので表に書き込みます。
22行目、i に 1 を足します。
23行目、j から 1 を引きます。
書き換えなので表に書き込みます。
| x[1 2 3 4 5 6 7] | Pivot | i | j | 
|---|---|---|---|
| 3 5 | 6 | ||
| 3 5 1 4 7 2 6 | 4 | 6 | 
10行目に戻って x[4] と Pivot を比べます。
Trueなので i を書き換えます。
| x[1 2 3 4 5 6 7] | Pivot | i | j | 
|---|---|---|---|
| 3 5 | 6 | ||
| 3 5 1 4 7 2 6 | 6 | ||
| 5 | 
10行目に戻って x[5] と Pivotを比べます。
Falseなのでループを抜けます。
13行目 Pivot と x[6] を比べます。
Falseなのでループを抜けます。
16行目はFalseなので17行目は実行しません。
19から21行目は三角交換です。
x[ i ] と x[ j ] を交換します。
書き換えなので表に書き込みます。
22行目 i に 1 を足します。
23行目 j から 1 を引きます。
書き換えなので表に書き込みます。
| x[1 2 3 4 5 6 7] | Pivot | i | j | 
|---|---|---|---|
| 3 5 | 6 | ||
| 3 5 1 4 | |||
| 3 5 1 4 2 7 6 | 6 | 5 | 
10行目に戻って x[6] と Pivot を比べます。
Falseなのでループを抜けます。
13行目 Pivot と x[5] を比べます。
Falseなのでループを抜けます。
16行目はtrueなので17行目でループからbreakします。
25行目 i と k を比べます。
Falseなので26行目は実行しません。
28行目 k と j を比べます。
Trueなので29行目を実行します。
Last が 5 になりました。
2回目の初期値
| Top | Last | 
|---|---|
| 1 | 5 | 
| x[1 2 3 4 5 6 7] | Pivot | i | j | 
|---|---|---|---|
| 3 5 1 4 2 7 6 | 1 | 1 | 5 | 
よって設問1の「a」は「ア」です。
2回目
内側のループの1回目でできる表はこうなります。
| x[1 2 3 4 5 6 7] | Pivot | i | j | 
|---|---|---|---|
| 1 | |||
| 1 5 3 4 2 7 6 | 2 | 2 | 
さてここが問題の部分です。
さっきと同じであとはループをBreakするだけだろうと思い込み、トレースを省略してしまうと誤回答してしまいます。
プログラムには無駄な行は一行もないので、省略できる処理はありません。全部やりきる覚悟が必要です。
では処理を見てみましょう。
10行目に戻って x[2] と Pivot を比べます。
Falseなのでループを抜けます。
13行目 Pivot と x[2] を比べます。
True!! なので j を書き換えます。
| x[1 2 3 4 5 6 7] | Pivot | i | j | 
|---|---|---|---|
| 1 | |||
| 1 5 3 4 2 7 6 | 2 | ||
| 1 | 
13行目に戻って Pivot と x[1] を比べます。
Falseなのでループを抜けます。
16行目はtrueなので17行目でループからbreakします。
25行目 i と k を比べます。
Trueなので26行目を実行します。
28行目 k と j を比べます。
Falseなので29行目は実行しません。
Top が 2 になりました。
3回目の初期値
| Top | Last | 
|---|---|
| 2 | 5 | 
| x[1 2 3 4 5 6 7] | Pivot | i | j | 
|---|---|---|---|
| 1 5 3 4 2 7 6 | 3 | 2 | 5 | 
よって設問1の「b」は「ウ」です。
設問はこれで終了ですが、処理を続けます。
3回目
10行目 x[2] と Pivot を比べます。
Falseなのでループを抜けます。
13行目 Pivot と x[5] を比べます。
Falseなのでループを抜けます。
16行目はFalseなので17行目は実行しません。
19から21行目は三角交換です。
x[i] と x[j] を交換します。
22行目、i に 1 を足す。
23行目、j から 1 を引く。
| x[1 2 3 4 5 6 7] | Pivot | i | j | 
|---|---|---|---|
| 1 | 3 | ||
| 1 2 3 4 5 7 6 | 3 | 3 | 4 | 
10行目 x[3] と Pivot を比べます。
Falseなのでループを抜けます。
13行目 Pivot と x[4] を比べます。
Trueなので j から 1 を引く。
| x[1 2 3 4 5 6 7] | Pivot | i | j | 
|---|---|---|---|
| 1 | 3 | ||
| 1 2 3 4 5 7 6 | 3 | 3 | |
| 3 | 
13行目 Pivot と x[3] を比べます。
Falseなのでループを抜けます。
16行目はtrueなので17行目でループからbreakします。
25行目 i と k を比べます。
Trueなので26行目を実行します。
28行目 k と j を比べます。
Trueなので29行目を実行します。
Top が 4 、Last が 2 になりました。
4回目の初期値
| Top | Last | 
|---|---|
| 4 | 2 | 
5行目の Top<Last がFalseなのでLoopを抜けます。
32行目 x[k] をreturnします。
x[k] は「3」なので、7個のデータの中で3番目に小さい値は「3」です。
ホームに戻るボタン↓
