CSP-J 入门级 · CSP 2020 入门级第一轮 第 5 题

选择题 · 答案 C · 考点:排序基础

← 整套速查表 CSP-J 入门级 全部真题

题目

冒泡排序算法的伪代码如下:

输入:数组L, n ≥ k。输出:按非递减顺序排序的 L。
算法 BubbleSort:
   1. FLAG ← n //标记被交换的最后元素位置
   2. while FLAG > 1 do
   3.     k ← FLAG -1
   4.     FLAG ← 1
   5.     for j=1 to k do
   6.         if L(j) > L(j+1) then do
   7.              L(j)  ↔ L(j+1)
   8.              FLAG ← j

对 $n$ 个数用以上冒泡排序算法进行排序,最少需要比较多少次?( )。

答案:C

考点

排序基础

解题思维

这题考优化版冒泡排序的最好情况。拿到题先看FLAG初始值n,想到如果数组已经有序,第一轮遍历完就不会发生交换,FLAG会立刻变成1,循环直接结束。所以关键就是算出第一轮到底比了几次。

常见错误

最容易犯的错误就是死记冒泡排序复杂度是O(n^2),看到冒泡就以为不管怎么排都要比n(n-1)/2次。这道题特意给了优化代码,就是考你是否读懂了FLAG的作用。很多同学会忽略FLAG在没发生交换时会被重置为1,导致误以为要跑多轮;或者把题目问的'最少'看成了'最多',算出n(n-1)/2选了A。还有人会纠结FLAG是不是从0开始,其实代码里FLAG初始就是n,第一轮k就是n-1,直接比n-1次。

详细解析(节选)

这道题考什么

考排序基础里的冒泡排序优化。标准冒泡每轮把最大元素冒到最后,要跑n-1轮,总比较次数是n(n-1)/2。但这道题给的代码加了个FLAG,专门记录本轮最后发生交换的位置,下一轮就不用再比后面的元素了。题目问的是'最少'需要比较多少次,那就是问最好情况——数组原本就有序时,算法到底跑几步。

概念与命题视角

命题人挖坑很典型:代码看着像要跑多轮,但关键变量FLAG在没发生交换时会被重置为1,导致while循环直接退出。很多学生只背了'冒泡最坏O(n^2)',却没细看优化逻辑,看到冒泡就默认要跑n-1轮,结果选了A(n^2)或者B(n-2)。这道题就是让你真正读懂伪代码,而不是靠印象做题。

思考心法:拿到题先想什么

1. 先看FLAG初始值:FLAG ← n。说明第一轮要遍历到n-1。 2. 看while条件:while FLAG > 1。只要FLAG大于1就继续,一旦FLAG变成1,循环直接结束。 3. 看for循环里有没有交换:if L(j) > L(j+1) then swap,并且swap后FLAG ← j。也就是说,只有真的交换了,FLAG才会更新成当前j,否则FLAG保持原来的值。 4. 所以如果数组已经有序,第一轮for循环跑下来,一次if都不成立,FLAG永远保持1,while条件不满足,程序结束。

具体怎么算

数组已有序时:

因此,最少比较次数就是n-1。

避坑

考频与趋势

排序是入门级高频考点,题库共249题,覆盖9个级别。从近年数据看,2023年22题、2024年51题、2025年57题、2026年50题,呈现爆发式增长,说明命题人越来越喜欢考算法细节和边界情况。冒泡排序作为最基础算法,几乎每年都会出现,但考法在变化:以前多考最坏/平均复杂度,现在更爱考优化逻辑、最好情况、甚至让你手写代码填空。

预测

基于2023-2026年的趋势,未来几年排序相关题目会继续增多,而且更偏向考察对算法流程的精细理解,比如不同优化策略的比较、特定输入下的执行路径、或者结合其他数据结构(如链表)的排序实现。对于冒泡排序,可能不再单纯问复杂度,而是给出变形代码(如本题的FLAG优化),要求分析最好/最坏/平均情况,或者让你补全代码、判断输出。因此,复习时不能只背公式,一定要亲手模拟几遍代码,特别关注变量在循环中的变化,尤其是像FLAG这种控制循环次数的关键变量。

同考点真题

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