GESP 四级 · GESP 202309 C++ 四级 第 15 题

选择题 · 答案 C

← 整套速查表 GESP 四级 全部真题

题目

在下列代码的横线处填写( ),完成对有 $n$ 个 int 类型元素的数组 array 由小到大排序。

void BubbleSort(int array[], int n) {
    for (int i = n; i >= 2; i--) {
        for (______) // 在此处填入代码
            if (array[j] > array[j + 1]) {
                int t = array[j];
                array[j] = array[j + 1];
                array[j + 1] = t;
            }
    }
}
答案:C

解题思维

这题考冒泡排序的内层循环边界。拿到题先看外层 i 从 n 递减到 2,说明每轮末尾 i-1 个元素已排好。内层只需扫前面 i-1 个元素,j 从 0 起,上界自然是 i-1,填 j < i - 1 就对了。

常见错误

最容易栽在两个地方:一是把 j 从 1 开始,导致下标 0 的元素永远不参与比较,排序结果肯定错;二是误以为内层要扫到 n 或 i,这样要么越界访问 array[n],要么多比较一次把已归位的最大值又搅乱。命题人特意用 i 做内层边界,就是为了卡住那些只背模板、不懂推导的人。

详细解析(节选)

【考点】冒泡排序|循环边界控制|数组下标操作

冒泡排序的核心思想是:每一轮把当前未排序部分的最大值“冒”到末尾。外层循环变量 i 从 n 递减到 2,意味着每轮结束时,末尾的 i-1 个元素已经就位。因此内层循环只需要处理前 i-1 个元素,比较相邻的 array[j] 和 array[j+1]。

看代码结构:外层 for (int i = n; i >= 2; i--),内层要填的是 j 的循环条件。j 从 0 开始,因为数组下标从 0 起,第一个元素必须参与比较;j 最大只能到 i-2,否则 j+1 会越界访问到 array[i-1] 之后的位置。所以内层循环条件必须是 j < i - 1。

对比选项:A 错在 j 从 1 开始,下标 0 的元素被遗漏;B 错在 j < n,外层 i 已递减,内层仍到 n 会导致越界;D 错在 j < i,多比较一次,把已归位的最大值又参与交换,打乱已排序部分。只有 C 符合推导。

这里有个反命题思维:如果把排序改成选择排序,内层循环同样要比较到 i-1,但目标是最小值而非最大值;若改成快速排序,则完全需要分区逻辑,与本题结构无关。刷到类似题,先问自己:外层循环变量到底在控制什么?内层循环的上界是否会导致越界或多余比较?

考频趋势:基础语法在题库中占比最大,本题属于其中“循环边界控制”这一细分点,是 GESP 四级算法模块的高频考点。从历年数据看,2023 年此类题目数量激增(287 题),2024 年继续维持在高位(413 题),说明命题人持续重视对循环边界的考察。未来趋势上,预计 GESP 四级及五级仍会高频出现类似冒泡排序、选择排序的边界陷阱题,尤其是外层循环变量与内层边界的关联考察。

暂无足够依据预测更具体的年份分布,但基于现有数据,掌握循环边界推导是应对此类题目的关键。

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断