GESP 四级 · GESP 202506 C++ 四级 第 23 题

判断题 · 答案 A

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

题目

以下 C++ 代码,尝试对有 $n$ 个整数的数组 arr 进行排序。这个代码实现了选择排序算法。

for (int i = 0; i < n - 1; ++i) {
    int minIndex = i;
    for (int j = i + 1; j < n; ++j) {
        if (arr[j] < arr[minIndex])
            minIndex = j;
    }
    if (minIndex != i)
        swap(arr[i], arr[minIndex]);
}
答案:A

解题思维

答案A。在循环中遍历数组并累积结果时,注意累加变量的初始值和每次循环的更新方式。

常见错误

for循环体可能一次都不执行!这是和while循环一样的"先判断后执行"机制。

详细解析(节选)

【考点】选择排序|时间复杂度 O(n²)|数组排序

GESP 四级 C++ 必考基础排序,命题人专盯外循环边界。90% 考生会误写成 i < n 导致越界,或内循环从 j = i 开始重复比较。本题直接考察你是否真正理解算法流程,而非死记结论。

代码按经典选择排序流程:外层 i 每轮确定第 i 个最小值位置,内层 j 扫描剩余未排序段找最小值索引 minIndex,若 minIndex != i 才交换。这里 i < n-1 保证最后元素自动就位,j = i + 1 避免自比,swap 条件严谨。

陷阱藏在三处:一是外循环若写成 i < n 会访问 arr[n] 越界;二是内循环若从 j = i 开始会多做一次无意义比较;三是 swap 条件若去掉 != i 会导致空交换。本题故意省略 swap 条件,考你是否知道交换只在发现更小值时才需要。

若命题人想考越界,会把外循环改成 i < n;若考重复比较,会把内循环改成 j = i。刷到这类题先问:"为什么选 n-1 而不是 n?" 答案就在最后元素无需再参与排序——这是选择排序的本质特征。

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