ARTICLE · 1020612
真题解析|GESP202609 · 四级(2)有序网格——sort固然好用,排序思想更重要
GESP 2026年9月 · 四级赛后解析
有序网格排序基本功怎么练?
先逐行 · 再逐列sort好用,排序思想更重要
2026年9月GESP四级第二道编程题是《有序网格》。
与第一题《新汉诺塔》相比,这道题的思维难度并不高。题目已经把操作步骤说得很清楚:
先把每一行从左到右升序排序→ 再把每一列从上到下升序排序→ 输出最终网格真正决定能不能稳定拿分的,是编程基本功:二维数组会不会访问,行和列能不能分清,多层循环能不能控制准确,比较与交换能不能写对,题目规定的操作顺序能不能严格执行。
很多孩子看到排序,会直接想到 `sort`。`sort`当然好用,但这道题不能只停留在“会调用函数”。尤其在处理矩阵的列时,元素在普通二维数组中并不是一段可以直接交给 `sort` 的连续区间。孩子仍然要理解下标怎样变化、比较谁和谁、交换哪些位置。
因此,这道题真正检验的是:离开一行现成的 `sort`,孩子能不能依靠数组、循环、判断和交换,把排序过程完整地实现出来。
PART 01
先看这道题在检查哪些基本功
这道题几乎没有复杂算法,却同时覆盖了四级阶段最重要的几项能力:
二维数组的输入与输出行下标、列下标的控制多层循环的边界相邻元素的比较与交换基础排序的完整实现严格执行“先行后列”的操作顺序任何一个环节不扎实,都可能出现样例能过、换一组数据就出错的情况。因此,简单题更适合检查真实基本功。
PART 02
第一步:把题意翻译成两个独立任务
拿到题目,先不要马上写循环。可以先在草稿纸上写出:
任务一:逐行排序任务二:逐列排序而且两项任务有明确的先后关系:必须先完成所有行排序,再开始列排序。
这一步看似简单,却是本题最重要的读题要求。程序不是只要“最后看起来有序”就可以,而是要忠实执行题目规定的过程。
PART 03
第二步:先手动完成一行排序
假设某一行是:
6 5 4 2 1如果使用冒泡排序,就从左到右比较相邻数字。左边比右边大,就交换位置。
第一轮:
6 5 4 2 1↓ 交换6和55 6 4 2 1↓ 交换6和45 4 6 2 1↓ 交换6和25 4 2 6 1↓ 交换6和15 4 2 1 6第一轮结束后,最大的6已经移动到这一行的最右边。
继续下一轮,剩余数字也会逐渐到达正确位置,最终得到:
1 2 4 5 6冒泡排序的重点,不是记住两层循环,而是理解:通过不断比较和交换,相对较大的数字逐步向右移动。
PART 04
第三步:把“一行”放回二维数组
一行排序会做以后,再回到二维网格。
假设网格有n行、m列。处理某一行时:
• 行号固定不变;
• 列号从左向右变化;
• 这一行共有m个元素。
可以把第1行暂时看成一个长度为m的一维数组,排完以后再处理第2行、第3行,直到第n行。
这一阶段只做行排序,不处理任何一列。
PART 05
第四步:所有行排完,再处理列
完成所有行排序后,开始第二项任务:逐列排序。
处理某一列时,思路与一行排序完全相同,只是方向变了:
• 列号固定不变;
• 行号从上向下变化;
• 这一列共有n个元素。
例如某一列是:
5241可以把它暂时看成一维数组:
5 2 4 1完成升序排序后,这一列变成:
1245对第1列到第m列依次执行,就能得到题目要求的最终网格。
PART 06
第五步:为什么要先全部排行,再全部排列
这道题要求的是:
所有行排序完成→ 所有列排序完成以下做法都会改变题目规定的过程:
• 排完一行,立刻去排某一列;
• 行排序和列排序交替进行;
• 把所有数字整体排序后重新填入网格;
• 完成列排序后,又回头重新排列。
排序操作会改变数字的位置。顺序不同,得到的中间状态和最终结果都可能不同。
因此,拿到这类操作题,可以先把步骤编号:
① 输入网格② 完成全部行排序③ 完成全部列排序④ 输出网格程序结构跟着这四步写,思路会非常清楚。
PART 07
sort很好用,但不能替代排序基本功
在C++中,`sort`可以快速完成一段连续区间的排序。实际做题时,如果题目允许,合理使用当然没有问题。
但工具解决的是“帮你排好”,基本功解决的是“你是否知道它为什么这样排、要排哪一段、下标怎样变化、数据不连续时怎么办”。只会写一行 `sort`,并不等于真正掌握了排序。
学习阶段建议至少能够独立写出一种基础排序,例如冒泡排序或选择排序,并能把它从一维数组迁移到矩阵的行和列。这样再使用 `sort`,是在理解基础上的提效,而不是用函数掩盖下标和循环不熟练的问题。
理解排序,才能处理不规则的数据
一维数组通常存放在连续位置,调用 `sort` 很方便。二维数组的某一行也是连续的,但某一列在内存中通常不是一个可以直接交给 `sort` 的连续区间。
这时,孩子必须知道自己在比较什么、交换什么,或者先把一列取出来排序,再放回原位置。
理解排序,才能改变排序规则
今后的题目可能要求:
• 从大到小排序;
• 按分数排序,分数相同再按编号排序;
• 奇数在前、偶数在后;
• 按字符串长度排序;
• 只对某个区间排序;
• 保留原始位置或编号。
这些题目表面上仍然在排序,真正考查的却是:如何确定比较规则、如何保存关联信息。
理解排序,才能看见更多算法思想
排序的用途远不止把数字变整齐。很多问题在排序之后会变得更容易:
• 找相邻数字之间的最小差值;
• 去除重复元素;
• 统计相同数字出现的次数;
• 合并区间;
• 使用双指针;
• 使用二分查找;
• 按顺序安排任务;
• 为贪心算法创造条件。
排序常常不是答案本身,而是解决问题之前最重要的一步。
PART 08
这道题最容易出现的四类错误
1. 混淆n和m
n表示行数,m表示列数。
排行时,一行中有m个元素;排列时,一列中有n个元素。把两者写反,在非方阵数据中很容易越界或漏掉元素。
2. 混淆固定下标和变化下标
排行时固定行号、改变列号;排列时固定列号、改变行号。
可以在草稿纸上写:
排行:a[固定行][变化列]排列:a[变化行][固定列]3. 冒泡轮数不足
只从左到右比较一遍,通常只能保证一个较大元素移动到末尾,不能保证整行或整列已经有序。
需要完成足够多轮比较,或者设置合理的提前结束条件。
4. 输出格式错误
同行数字之间用空格分隔,每行结束后换行。算法正确但格式不符合要求,同样可能无法通过测试。
PART 09
拿到这道题,推荐这样检查
完成思路后,可以用一个很小的网格在纸上验证:
3 2 16 5 4先逐行排序:
1 2 34 5 6再逐列排序。此时每一列本来已经升序,结果保持不变。
还可以自己设计一个“行排完以后,列仍然无序”的网格,检查第二阶段是否真正执行。
检查时依次问:
1. 所有行是否都排过?
2. 列排序是否在行排序全部完成后开始?
3. 每一列是否都排过?
4. n和m有没有用反?
5. 输出是否按行换行?
PART 10
这道题真正训练的是什么
《有序网格》本身并不难,但它非常适合检验孩子的编程基本功:
读懂操作顺序→ 把二维问题拆成多个一维问题→ 写对基础排序→ 分清行列下标→ 用小数据模拟验证基础题能稳定写对,靠的不是“见过原题”,而是对数组、循环和排序过程足够熟悉。
`sort`可以节省代码,排序思想却能帮助孩子解决更广泛的问题。
对正在学习GESP四级的孩子来说,建议做到三点:
1. 能手写一种基础排序;
2. 能解释每一轮比较后发生了什么;
3. 能把一维排序迁移到矩阵的行与列。
做到这些以后再使用 `sort`,才能真正做到工具会用、原理清楚、基本功扎实。
PART 11
写在最后
GESP四级处在从基础语法走向算法思维的重要阶段。
《新汉诺塔》考查的是怎样从模拟中发现递推结构;《有序网格》考查的是能否把明确的操作过程准确实现。
一道题训练思考深度,一道题检验基本功。两种能力都重要。
——魔都信奥直通车
本文依据CCF GESP官网公布的2026年9月C++四级试题整理,题目与数据范围以官方试卷为准。
读懂规则 · 拆解过程 · 写对程序
魔都信奥直通车 · 陪孩子稳步成长