跳到正文

令和5年度 ITパスポート試験 問60

这道题的解析和你的作答记录。

問60
頻出度★★☆

手続 printArray は,配列 integerArray の要素を並べ替えて出力する。手続 printArray を呼び出したときの出力はどれか。ここで,配列の要素番号は 1 から始まる。 〔プログラム〕 ○printArray() 整数型: n, m 整数型の配列: integerArray ← {2, 4, 1, 3} for (n を 1 から (integerArray の要素数 − 1) まで 1 ずつ増やす) for (m を 1 から (integerArray の要素数 − n) まで 1 ずつ増やす) if (integerArray[m] > integerArray[m + 1]) integerArray[m] と integerArray[m + 1] の値を入れ替える endif endfor endfor integerArray の全ての要素 を先頭から順にコンマ区切りで出力する

出典 令和5年度 ITパスポート試験 問60
解説

問 60冒泡排序是通过比较并交换相邻元素来排序的算法

  • ア

    正解 该程序比较相邻的 2 个元素,若左边比右边大就交换,是“冒泡排序(升序)”。初始数组为 {2, 4, 1, 3}。外层 n 取 1〜3,内层 m 取 1〜(4−n)。n=1 的扫描(m=1〜3)中 {2,4,1,3}→{2,1,4,3}→{2,1,3,4};n=2 的扫描(m=1〜2)中 {2,1,3,4}→{1,2,3,4};n=3 的扫描(m=1)中没有交换,保持 {1,2,3,4}。因此输出为“1,2,3,4”,正确答案是ア。

  • 错误イ

    “1,3,2,4”中 2 与 3 的顺序颠倒,没有按升序排列。把每一次扫描都执行到最后,2 会排在 3 之前,因此不会得到这种排列。

  • 错误ウ

    “3,1,4,2”没有排好序,是只把初始数组处理到中途(或弄错了比较条件)的错误结果。程序会执行全部扫描,完全按升序排列。

  • 错误エ

    “4,3,2,1”是降序。本程序的条件是“左>右就交换”,是把较大的值往后送的升序排序,因此不会变成降序。

ここがポイント
  • 冒泡排序是通过比较并交换相邻元素来排序的算法。条件“若 integerArray[m] > integerArray[m+1] 就交换”意味着把较大的值搬到末尾的升序排列。
  • 对伪代码的双重循环,要逐个追踪(trace)数组的值来稳妥地求解。要点在于:内层循环的上限是(元素个数 − n),从而把已确定的末尾元素排除在比较之外。
用語
解答問60ア
练这一题

作答记录