scratch编程与算法进阶第二版pdf(程序猿老爸的Scratch算法课)
scratch编程与算法进阶第二版pdf(程序猿老爸的Scratch算法课)插入排序是一种从序列左端开始依次对数据进行排序的算法。在排序过程中,左侧的数据陆续归位,而右侧留下的就是还未被排序的数据。插入排序的思路就是从右侧的未排序区域内取出一个数据,然后将它插入到已排序区域内合适的位置上。这不就是我们玩牌时整理牌所用的方法吗?起牌时,默认第一张是排好序的,第二张如果比第一张小就插到第一张的前面,然后第三张、第四张……直到完全整理好。今天的算法课开始了。三个人玩跑得快,一个人16张牌。洗牌,发牌,然后呢?起一张牌,按照从小到大的顺序插入到合适的位置,把手上的16张牌整理好,才好发现有没有对子,有没有顺子,有没有三张,有没有“飞机带翅膀”……扯远了。今天的手气可真臭,居然让一个毛孩子赢了一把!“好了!娱乐适可而止!小骞,你还记得你刚才是怎么理牌的吗?”输红了眼的老爸露出狡黠的目光。“嘿嘿,小样!我还治不了你!”
“小骞,来打牌了。”
“今天玩什么呀?”
“来局跑得快怎么样?”
“那要叫上妈妈!”
三个人玩跑得快,一个人16张牌。洗牌,发牌,然后呢?起一张牌,按照从小到大的顺序插入到合适的位置,把手上的16张牌整理好,才好发现有没有对子,有没有顺子,有没有三张,有没有“飞机带翅膀”……扯远了。
今天的手气可真臭,居然让一个毛孩子赢了一把!
“好了!娱乐适可而止!小骞,你还记得你刚才是怎么理牌的吗?”输红了眼的老爸露出狡黠的目光。“嘿嘿,小样!我还治不了你!”
今天的算法课开始了。
插入排序算法插入排序是一种从序列左端开始依次对数据进行排序的算法。在排序过程中,左侧的数据陆续归位,而右侧留下的就是还未被排序的数据。插入排序的思路就是从右侧的未排序区域内取出一个数据,然后将它插入到已排序区域内合适的位置上。这不就是我们玩牌时整理牌所用的方法吗?起牌时,默认第一张是排好序的,第二张如果比第一张小就插到第一张的前面,然后第三张、第四张……直到完全整理好。
(网络图片)
算法流程图如下(红框部分下面会详细说明)∶
(纯手绘,很费功夫啊,点个赞吧!)
第一个数据默认是排好序的,所以我们要插入的数据从第二个开始,当插入最后一个数据后,整个列表就排好序了。
Scratch实现插入排序算法“初始化列表”积木
上一篇已经讲过“初始化列表”积木的实现方法,今天加点难度,初始化10个不相同的数字。
上代码!
积木中使用了一个临时变量来存放生成的随机数,然后检查该随机数是否在列表中存在,如果存在则继续取一个新的随机数,直到列表放满。
这个检查的循环逻辑使用了“……不成立”这个判断作为退出条件,后面也会用到哦。
算法实现
接下来按照流程图实现一下算法。
算法整个实现还是比较清晰的,代码长度和冒泡排序算法差不多。但流程图中红框框出来的部分的实现可需要动一下脑筋来理解。
只有当“插入位置大于等于1”和“列表[插入位置]大于临时数据”两个条件同时成立时,才去移动数据,否则直接把临时数据放到列表第插入位置 1的位置就可以了。所以,这个循环的退出条件是当“插入位置大于等于1”和“列表[插入位置]大于临时数据”两个条件任何一个不成立或都不成立。
我们把“插入位置大于等于1”称为条件A,“列表[插入位置]大于临时数据”称为条件B,则根据条件A和条件B的判断结果可以得到∶
这个判断涉及到逻辑与与逻辑非的数学概念。
于是我们的退出条件也写成了∶
这个判断可能是小朋友理解这个算法的难点。
来试试运行效果吧!
“小骞,通过玩扑克牌,我们发现了两种不同的排序算法。”
“嗯!打牌可有意思了!”
……这不是重点!
“哼嗯哼。这说明,算法的发明不是凭空产生的,而是对日常经验的总结。算法科学家们分析人们日常处理问题的办法,并对其进行抽象和数学分析,再经过严密的逻辑推论,才形成了算法。”我语重心长的说,“比如今天讲的插入排序算法,经过科学家们的优化,发明了希尔排序算法。另外还有需要额外存储空间但排序更快的堆排序和桶排序算法,充分发挥计算机递归运算优势的归并排序及快速排序算法等等。”
……
“爸爸,我们来打牌吧!”
“玩什么玩!快写作业去!”老爸落荒而逃……