下面函数使用冒泡排序将数组按升序排列。为了在数组已经有序时提前结束,两处横线应分别填写 ( )。
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;
}
}看到冒泡排序先想"为什么需要 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。命题人正是利用这种"改一个条件答案就全变"的特性,确保你真正理解逻辑而非死记答案。