>a イが正解なのはなぜですか?
>b オが正解なのはなぜですか?
⇒
以下順を追って解説
C言語で、T[5]としたとき T[0]ダミー, T[1]~T[5]
ポイント
a) これは選択ソートです。(昇順(最小値)/降順(最大値))
...選択ソートの特徴は以下
.....最小値と、最小値の添え字を記憶
Min = T[j];
MinCnt = j;
.....記憶した情報と入替え
W = T[i];
T[i] = T[MinCnt];
T[MinCnt] = W;
b) 一つのデータとそれ以外と比較する
b-1 外側ループは(N-1)回処理する(最後の比較が一つと一つで比較)
b-2 内側ループは比較対象データ群なので、外側のデータとそれ以外のデータ群
b-3 内側ループ完了の都度、外側の位置に最小値が求まるので、外側はその情報を除外する(即ち、iは1ずつ進む)
c) 回答群を見渡すと、外側ループ処理 「(i\u0026lt;N)迄」、または、「(i\u0026lt;=N-1)迄」が見当たらない
即ち、この設問は逆論理回答
c-1 (i\u0026lt;N)の逆論理...... (i\u0026gt;=N)
c-2 (i\u0026lt;=N-1)の逆論理... (i\u0026gt;N-1)...(イ)
d) 回答群を見渡すと、内側ループ処理 「(j\u0026lt;=N)迄」が見当たらない
d-1 (j\u0026lt;=N)の逆論理...... (j\u0026gt;N)....(オ)
~~ [参考Cコード] ~~
#include \u0026lt;stdio.h\u0026gt;
#define GYAKU_RONRI 1 //逆論理
void disp(int d[], int n) {
for (int i = 1; i \u0026lt;= n; i++) printf(\u0026quot; %d\u0026quot;, d[i]);
printf(\u0026quot;\
\u0026quot;);
}
int main(void){
int T[] = {-1, 5, 3, 4, 1, 2}; // T[0]は未使用
int N = 5; // T[1]〜T[5]が対象
int i, j, MinCnt, Min, W;
printf(\u0026quot;前: \u0026quot;); disp(T, N);
i = 1;
#ifdef GYAKU_RONRI //逆論理
while( !(i \u0026gt; N - 1) ){ // i = 1〜4まで処理 (イ)
#else
while(i \u0026lt; N){ // i = 1〜4まで処理
#endif
MinCnt = i;
j = i + 1;
Min = T[i];
#ifdef GYAKU_RONRI //逆論理
while( !(j \u0026gt; N) ){ // j = i+1〜5まで比較 (オ)
#else
while(j \u0026lt;= N){ // j = i+1〜5まで比較
#endif
if (T[j] \u0026lt; Min) {
Min = T[j];
MinCnt = j;
}
j = j + 1;
}
// 要素の交換
W = T[i];
T[i] = T[MinCnt];
T[MinCnt] = W;
i = i + 1;
}
printf(\u0026quot;後: \u0026quot;); disp(T, N);
return 0;
}
~~ [結果] ~~
\u0026gt;main
前: 5 3 4 1 2
後: 1 2 3 4 5
━