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

选择题 · 答案 A · 考点:冒泡排序

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

题目

下面函数使用冒泡排序将数组按升序排列。为了在数组已经有序时提前结束,两处横线应分别填写 (  )。

void bubbleSort(int a[], int n) {
for (int i = n - 1; i > 0; i--) {
bool changed = __________;
for (int j = 0; j < i; j++) {
if (a[j] > a[j + 1]) {
int t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
changed = __________;
}
}
if (!changed)
break;
}
}
答案:A

考点

冒泡排序

解题思维

看到冒泡排序先想"为什么需要 changed 标志"——外层循环每轮把最大元素沉底,若某轮没发生任何交换,说明数组已有序,可提前结束。因此 changed 初始必须为 false(没交换才保持 false 触发 break),一旦发生交换必须置为 true(阻止 break)。

常见错误

B 项把初始化写成 true,导致永远不满足 break 条件,优化失效;C 项交换后仍赋 false,break 会在有交换时错误触发;D 项初始化 true 同样破坏逻辑。最阴险的是 changed 只在 if 块内赋值,若学生误以为它应初始为 true 才"安全",就会选错。

详细解析(节选)

考纲定位 本题出自 GESP 四级算法模块,命题人专门卡住"冒泡排序优化"这个高频薄弱点——四级考生普遍会写冒泡,但很少注意提前结束条件,这道题用两处填空逼你理解 changed 标志的完整逻辑链。

解题思维 外层循环每轮把最大元素沉底,若某轮没发生任何交换,说明数组已有序,可提前结束。因此 changed 初始必须为 false(没交换才保持 false 触发 break),一旦发生交换必须置为 true(阻止 break)。

陷阱拆解

反命题思维 若把 changed 初始改为 true,题目就会变成"无论是否有序都完整跑完",答案变成 B;若把交换条件改成 a[j] < a[j+1],则 changed 应赋 false,答案变成 C。命题人正是利用这种"改一个条件答案就全变"的特性,确保你真正理解逻辑而非死记答案。

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