GESP 四级 · GESP 202409 C++ 四级 第 13 题

选择题 · 答案 A · 考点:算法、循环控制

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

题目

下面代码实现了插入排序函数(升序),则横线上应填写( )。

void insertion_sort(vector<int> &nums) {
    for (int i = 1; i < nums.size(); i++) {
        int base = nums[i], j = i - 1;
        // 在此处填入代码
        {
            nums[j + 1] = nums[j];
            j--;
        }
        nums[j + 1] = base;
    }
}
答案:A

考点

算法循环控制

解题思维

答案A。代码补全要考虑参数传递方式。如果需要修改实参,需用指针(*)传递。排序算法要理解每步比较的含义。

常见错误

排序代码补全要理解每步比较的含义。选择排序找最小值时比较的是array[min]>array[j]。

详细解析(节选)

【考点】排序算法|循环控制|数组操作

🎯 考纲定位 GESP 四级《算法与数据结构》模块核心考点——插入排序。命题人卡住的是对排序算法核心逻辑的掌握,这是四级算法模块的必考基础。

🧠 解题思维 插入排序的核心是把当前元素base插入到前面已排好序的子序列中。代码里j从i-1开始向前遍历,当nums[j] > base时,说明base应该插到j+1位置,所以要把nums[j]右移一位(即nums[j+1]=nums[j])。这个while循环必须同时满足两个条件:一是索引j不能越界(j >= 0),二是确实需要移动(nums[j] > base)。

🪤 陷阱拆解 选项B错在j > 0,这会导致当j=0且nums[0]>base时循环提前终止,base无法正确插入到最前面。选项C、D的条件是<,这会把比base小的元素右移,逻辑完全反了——插入排序要移动的是比base大的元素。命题人利用的是对边界条件(j=0)和比较方向(> vs <)的双重考察。

🔄 反命题思维 反命题:如果把>改成<,代码就变成了把base插入到比它小的元素后面,这会破坏排序正确性;如果把j >= 0改成j > 0,当base应该放在数组首位时,循环条件不满足,base会被错误地放在nums[0]位置,导致排序失败。刷到类似题时,先问自己:"这个循环到底在移动谁?移动的方向对吗?边界条件覆盖了吗?"

同考点真题

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