手続 sort は,要素数が2以上の整数型の配列を引数 numberArray で受け取り,その要素を昇順に並べ替えた結果を出力する。手続 sort の動作確認のために,処理の途中で j の値と workArray の全ての要素を出力する。配列 numberArray を {3, 5, 1, 2, 4} とし,手続 sort を sort(numberArray) として呼び出したとき,j の値が3と出力された直後の workArray の全ての要素の出力はどれか。ここで,配列の要素番号は1から始まる。 〔プログラム〕 ○sort(整数型の配列: numberArray) 整数型: minIndex, j, k 整数型の配列: workArray ← numberArray // 配列の複製を作る for (j を 1 から (workArray の要素数 − 1) まで 1 ずつ増やす) // j 番目から末尾までの要素の中で最も小さい値をもつ要素の要素番号を // 一つ求める minIndex ← j for (k を (j + 1) から workArray の要素数 まで 1 ずつ増やす) if (workArray[k] が workArray[minIndex] より小さい) minIndex ← k endif endfor workArray[j] と workArray[minIndex] の値を入れ替える // 動作確認のために,j の値と workArray の全ての要素を出力する j の値を出力する workArray の全ての要素 を先頭から順にコンマ区切りで出力する endfor workArray の全ての要素 を先頭から順にコンマ区切りで出力する
令和8年度 ITパスポート試験 問67
这道题的解析和你的作答记录。
問67
頻出度★★☆
解説
問 67
错误ア
「1,2,3,4,5」是完全按升序排列的最终结果,它出现在 j=4 输出之后(把末尾的5和4交换之后)。在 j=3 之后末尾仍然是「…5,4」,故错误。
- イ
正解 本过程是选择排序,对每个 j 查找「从第 j 个到末尾中最小的元素」,并将该元素与第 j 个交换。设 workArray 与 numberArray 相同为 {3,5,1,2,4},按从1开始的元素编号追踪。j=1 时把最小值1(第3个)与第1个交换,得到 {1,5,3,2,4}。j=2 时把剩余 {5,3,2,4} 的最小值2(第4个)与第2个交换,得到 {1,2,3,5,4}。j=3 时剩余 {3,5,4} 的最小值是3,已经在第3个位置上,因此是与自身交换,数组保持 {1,2,3,5,4} 不变。因此在输出「j 的值3」之后紧接着的 workArray 是「1,2,3,5,4」,故イ正确。
错误ウ
「4,5,3,2,1」这种排列,从初始状态 {3,5,1,2,4} 开始的逐步追踪中,在任何时刻都不会出现。它与从头开始逐个确定最小值的选择排序行为不一致,故错误。
错误エ
「5,4,3,2,1」是按降序排列的状态,但本过程是升序排序,而且在处理过程的任何阶段都不会产生这种排列。这是把降序和升序弄反的误答,故错误。
ここがポイント
- 选择排序:每一轮 j 都求出「从第 j 个到末尾的最小元素」,并把其元素编号 minIndex 与第 j 个交换。如果最小元素已经在第 j 个位置上,就是与自身交换(实质上不变)。
- 伪代码追踪的要点是:以从1开始的元素编号逐步手动追踪数组,并读取每个 j 交换之后紧接着的数组状态。
用語