选择排序-第15届蓝桥第4次STEMA测评Scratch真题精选

[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第172讲。

第15届蓝桥杯第4次STEMA测评已于2024年1月28日落下帷幕,编程题一共有6题,分别如下:

选择排序,本题是2024年1月28日举行的第15届蓝桥STEMA测评Scratch编程中级组编程第6题。题目要求编程实现扑克牌排序,在舞台上随机出现4张点数不同的扑克牌,依次将最小的牌移到第1、第2、第3和第4个位置。

先来看看题目的要求吧。

一.题目说明

编程实现:

排序。

具体要求:

1). 点击绿旗,在舞台上出现4张点数不同的扑克牌,牌上的点数是随机的(4-9点),如图所示;

图片

2). 最左侧第1张扑克牌与四张扑克牌中最小的牌交换位置(如果第1张牌是最小的则不需要交换位置),如图所示;

1秒后,最左侧第1张扑克牌与四张扑克牌中最小的牌交换位置(如果第1张牌是最小的则不需要交换位置),如图所示;

图片

3). 1秒后,第2张扑克牌与第2、3、4三张牌中最小的牌交换位置(如果当前第2张牌是三张牌中最小的则不需要交换位置),如图所示;

图片

4). 1秒后,第3张扑克牌与第3、4两张牌中较小的牌交换位置(如果当前第3张牌是较小的则不需要交换位置),之后排序完成,四张扑克牌从左到右按从小到大的顺序排列,而后程序结束,如图所示。

图片

评判标准:

  • 16分:满足"具体要求"中的1);

  • 28分:满足"具体要求"中的2);

  • 28分:满足"具体要求"中的3);

  • 28分:满足"具体要求"中的4)。

二.思路分析

本题只有1个扑克牌角色,如图所示:

图片

扑克牌有6个造型,牌面分别为4、5、6、7、8、9,如图:

图片

这是一道算法题,考查的知识点包括克隆、运动、列表和排序算法。

这里的重难点是排序算法,又是排序算法,是不是感觉很熟悉。没错,就是排序,在历届蓝桥真题中,排序已经出现了不下10次,可以说是老朋友了。

但是这一次对排序的方式有具体的要求,同时通过扑克牌展示具体的排序过程。

排序是编程中最常见的基础算法,关于排序的算法也挺多的,一共有10来种,包括选择排序、插入排序、冒泡排序、快速排序、希尔排序、归并排序、计数排序、基数排序、桶排序和堆排序等。

本题所描述的排序是选择排序,其核心思想是这样的:

  • 首先在未排序的数列中找到最小(或者最大)元素,然后将其存放到数列的起始位置;

  • 接着再从剩余未排序的元素中继续寻找最小(或者最大)元素,然后放到已排序序列的末尾;

  • 以此类推,直到所有元素均排序完毕。

其排序方式可以参考下图:

图片

选择排序很像我们打扑克牌时,把牌从左到右扫描,找到最小的一张牌,放到最左边,然后从第二张牌继续扫描第二小的牌,放到第二的位置,以此类推,直至所有的牌都排列好。

需要注意的是,在编程中,每次找到最小的牌时,需要交换两张牌的位置。由于每一轮只能处理一张牌,并且最后一张牌无需处理,所以对于n张扑克牌,需要进行n-1轮排序。

为了更好地理解选择排序,下面介绍如何使用扑克牌来演示详细的排序过程。

准备扑克牌一副,红蓝色棋子各一枚,为便于演示,取牌面为2、5、6、7、9的5张纸牌进行排序操作。将5张纸牌打乱顺序,假定牌面从左到右依次为7、9、5、2、6。

图片

由于每次都需要挨个比较找到最小的纸牌,因此5张牌需要进行4轮排序。

第1轮排序:

将红色和蓝色棋子放在左边第1张纸牌上方,标记为j,然后从红色棋子所在位置的下一张纸牌(j+1)开始,从左至右依次把每一张纸牌与蓝色棋子所在位置的纸牌进行比较,并将蓝色棋子放置在较小的纸牌上方。直到将红色棋子右边的纸牌全部比较一遍,此时蓝色棋子就停留在最小的纸牌上方。

然后将红色棋子和蓝色棋子所在位置的两张纸牌交换位置,至此完成第一轮排序,最小的一张纸牌2被移到正确位置,如图:

图片

第2轮排序:

将红色棋子和蓝色棋子放置于左边第2张纸牌上方(j=2),按照上述步骤进行比较,然后交换位置,在第二轮排序完成之后,纸牌5就移到了正确位置,如图:

图片

第3轮排序:

再将红色和蓝色两枚棋子置于左边第3张纸牌上方(j=3),重复上述过程,对纸牌进行比较和交换,完成第三轮排序后,纸牌6就移到了正确位置,如图:

图片

第4轮排序:

继续移动棋子,将它们放到左边第4张纸牌上方(j=4),继续前面的步骤,在第四轮排序完成之后,纸牌7就处于正确的位置,而剩下的纸牌9自然而然也就处于正确位置了,如图:

图片

至此,整个排序过程结束,5张扑克牌已经按照从小到大排好序了,依次为2,5,6,7,9。

排序过程中,这里的红色棋子和蓝色棋子是用来进行标记的,在编程时可以使用变量来表示。

思路有了,接下来,我们就进入具体的编程实现环节。

三.编程实现

根据上面的思路分析,我们分4步来编写程序:

  • 构造随机列表

  • 克隆纸牌

  • 实现选择排序

  • 交换纸牌

1. 构造随机列表

由于扑克牌是随机排列的,一共有6张扑克牌,要随机选4张,因此需要创建一个列表,将随机出来的4张扑克牌的点数存入列表。

为了方便,我们可以定义一个自制积木,用于构造随机列表,代码如下:

图片

代码不多,强调3点:

1). 每次都需要先清空列表;

2). 为了确保没有重复的数字,因此需要对随机出来的数字进行判断;

3). 列表中保存的扑克牌的牌面数字,不是造型编号。

2. 克隆纸牌

有了随机列表,就可以根据列表中的数字来依次克隆扑克牌了。

克隆本身比较简单,由于后续需要交换扑克牌的位置,因此还需要使用列表保存4张扑克牌的位置,同时使用私有变量对扑克牌进行编号,编号依次为1、2、3、4。

在绿旗下编写代码如下:

图片

简单说明两点:

1). 4张牌的y坐标是固定,只有x坐标不同,因此只需要保存x坐标;

2). 这里的变量”_ID“是私有变量,为了和全局变量进行区分,专门添加了下划线,这是一个好的编程习惯。

对应的,需要设置克隆体的造型,代码如下:

图片

代码比较简单,但需要注意,通过ID获取列表中的数字后,需要减去3。这是因为在”换成造型“指令中使用变量或运算时,优选匹配的是造型编号,而第一个造型对应的牌面是4,牌面数字和造型编号之间相差3。

执行代码,就可以实现4张扑克牌的随机排列。

3. 实现选择排序

接下来就是选择排序了,根据前面的思路分析,需要使用嵌套循环来实现。为了更好地组织代码,我们使用自制积木来实现排序,代码如下:

图片

代码比较多,说明5点:

1). 这是一个典型的两层循环结构,外层循环表示轮次,这里有4张牌,所以需要进行3轮排序;内层循环表示每一轮的比较过程; 

2). 每一轮比较,都需要记录最小值和最小值的下标(在列表中的编号),并且需要进行初始化。为了简单起见,这里直接将下标初始化为0,最小值则设为100,当然也可以设为其它值,只要比所有的牌面数字大就行;

3). 每一轮比较,都是从未排序的第一张牌开始,因此重复次数和轮数有关系,它等于5-轮数;

4). 每一轮比较完成,都会得到最小下标值,如果等于轮数,则说明不需要交换,否则需要交换,交换时,需要借助一个临时变量;

5 ). 每一次交换之前需要等待1秒,一旦列表中的数据交换完毕,就需要交换扑克牌了,所以发送了一个”交换“的广播,等待扑克牌交换位置后继续下一轮排序。

然后在绿旗指令的末尾使用这个自制积木,如图:

图片

4.交换纸牌

在接收到”交换“广播后,对应的两张牌需要交换位置,这里的难点是如何知道是哪两张牌呢,又是怎么交换位置的呢?

如果你做过洗牌发牌这道题,你会发现其实挺简单的,具体的分析可以参考《洗牌发牌-第14届蓝桥杯STEMA测评Scratch真题精选》这篇教程。

这里有两个列表,一个是四张牌的x坐标,另一个是四张扑克牌的数字,如图:

图片

两个列表的编号都是1、2、3、4,对于每张扑克牌而言,可以通过造型名称找到在”点数“列表中的编号,再通过这个编号到”x坐标“列表中找到其坐标,如此就可以确定每张扑克牌的x坐标了。

比如,第一次排序后,”点数“列表中的6和8进行交换,列表就变成了:

图片

对于扑克牌8来说,它在“点数”列表中的编号是4,对于扑克牌6来说,它的编号则是1,有了这两个编号,就可以确定其x坐标分别为180和-180,两种牌分别移到自己的位置即可。

交换之后,如图所示:

图片

这一下应该彻底理解了吧,代码其实就只有一行,如下:

图片

实际上,4张牌都会执行上述代码,只是另外两张扑克牌的x坐标没有发生变化而已。

至此,整个作品就创作好了,你可以运行程序来测试效果啦。

四.总结与思考

本题是中级组编程部分第6题,分数为100分,积木块数量75个左右,涉及到的知识点主要包括:

  • 列表运算;

  • 循环编程,尤其是嵌套循环;

  • 克隆编程;

  • 变量的使用,包括全局变量和私有变量;

  • 选择排序算法;

这是中级组最后一题,难度较大,完成时间30分钟左右,难点有两个,一是选择排序的算法思想和实现过程,二是如何交换扑克牌。

对于排序,已经无需再强调了,是100%要掌握的基础算法。对于初级组的考生来说,只需要掌握简单的排序即可,但是对中级组的考生而言,必须要掌握冒泡排序、选择排序和插入排序等经典算法。

同时还要强调一点,一些经典的场景在蓝桥比赛中会反复出现,比如这里的排序,这里的扑克牌交换位置,因此,我们一定要重视对历届真题的学习。

超平老师给你留一个思考题,选择排序和冒泡排序有何区别,哪种排序算法更好呢?

如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄

需要素材和源码的,可以移步至“超平的编程课”gzh。

  • 27
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值