下面的函数 selectTopK() 实现从 $n$ 个学生中选出前 $k$ 名成绩最好的学生颁发奖学金(不需要对所有学生完全排序,只需要找出前 $k$ 名),则横线上应填写( )。
struct Student {
string name;
int score;
};
void selectTopK(Student students[], int n, int k) {
for (int i = 0; i < k; i++) {
int maxIdx = i;
for (__________________) { // 在此处填入代码
if (students[j].score > students[maxIdx].score) {
maxIdx = j;
}
}
if (maxIdx != i) {
Student temp = students[i];
students[i] = students[maxIdx];
students[maxIdx] = temp;
}
}
}答案B。代码补全要考虑参数传递方式。如果需要修改实参,需用指针(*)传递。排序算法要理解每步比较的含义。
排序代码补全要理解每步比较的含义。选择排序找最小值时比较的是array[min]>array[j]。
【考点】选择排序|循环嵌套
本题考查选择排序算法在 GESP 四级"算法设计与分析"模块中的核心应用。命题人卡住绝大多数考生的弱点在于:只会背诵"冒泡排序"的相邻交换逻辑,却对选择排序的"每轮从剩余部分选最大"这一本质理解模糊,一遇到嵌套循环就慌。