游戏大赛决赛,两组选手分别按得分从小到大排好队,现在要把他们合并成一个有序排行榜。
A 组: $A = \{12, 35, 67, 89\}$ , B 组: $B = \{20, 45, 55, 78\}$ ,下面是归并合并函数的核心循环,横线处应填入( )。
int i = 0, j = 0;
vector<int> result;
while (i < A.size() && j < B.size()) {
if (_____________) {
result.push_back(A[i++]);
} else {
result.push_back(B[j++]);
}
}
while (i < A.size()) {
result.push_back(A[i++]);
}
while (j < B.size()) {
result.push_back(B[j++]);
}STL 容器:vector(动态数组)、set/map(红黑树,有序)、unordered_set/map(哈希表,无序)。注意迭代器失效问题。
填空时注意语法完整性:分号、括号匹配、函数参数类型和个数、返回值类型。
【考点】归并排序思想|双指针技巧|条件判断逻辑
GESP 五级算法模块核心。命题人专挑"有序数组合并"考学生是否理解"归并"本质——不是比索引,而是比值。
两个已排序数组,要合并成有序,只能每次取当前两端较小者。这就是归并排序 merge 阶段的标准写法:while 循环不断从 A 或 B 头取最小值入 result,最后把剩余元素追加。
A 选项 A[i]>=B[j] 会取较大值,直接破坏有序;C、D 选项比索引 i/j,但题目要求比较的是数组元素值。若只背"双指针"而不理解"比较对象",必选错。这是典型的偷换概念陷阱——指针移动条件必须关联数值大小,而非下标关系。
若改成降序合并,条件应反转为 A[i]>=B[j]。刷到合并题先问:要保留什么顺序?对比什么?