以下 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。在循环中遍历数组并累积结果时,注意累加变量的初始值和每次循环的更新方式。
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?" 答案就在最后元素无需再参与排序——这是选择排序的本质特征。