乐于分享
好东西不私藏

图形化编程(源码):二分查找法查学号

图形化编程(源码):二分查找法查学号

之前有篇文章已经介绍过二分查找。
图形化编程(Scratch):线性查找和二分查找
今天我们再次利用二分查找做一个查学号的项目。学号已有序排列。这是使用二分查找的前提。
视频效果:

已关注

关注

重播 分享

积木参考:
积木说明:
  1. 当“开始”被点击
    就像游戏里的“开始按钮”,点一下,程序就运行。

  2. 询问“请输入你要查询的学号”并等待
    电脑会问你要查哪个学号,你输入数字,然后电脑等着你输完。

  3. 设置变量“学号”的值为“获得答复”
    把你刚才输入的学号,存进一个叫“学号”的小盒子里。

  4. 重置计时器
    让计时器归零,准备重新计时。

  5. 开始计时器
    计时器开始跑秒。

  6. 重复执行直到……
    一直重复做里面的动作,直到某个条件满足才停下。

  7. 最大值、最小值
    这是两个“小盒子”,用来记录查找范围。
    一开始,最大值是列表的长度(最后一项的位置),最小值是1(第一项的位置)。

  8. 设置变量“查找”的值为:四舍五入((最大值+最小值)/2)
    在最大值和最小值的中间找一个位置(取中间数,四舍五入)。

  9. 如果“学号列表”的第“查找”项 = 学号
    看看中间这个位置上的学号,是不是你要找的那个。

  10. 设置变量“最大值”的值为“查找”
    如果中间项比要找的学号大,说明要找的学号在左边,就把最大值改成中间位置。

  11. 否则如果“学号列表”的第“查找”项 < 学号
    如果中间项比要找的学号小,说明要找的学号在右边。

  12. 设置变量“最小值”的值为“查找”
    把最小值改成中间位置。

  13. 否则
    如果不是大于也不是小于,那就是等于(找到了)。

  14. 对话:把“学号在列表的第”、“查找”、“行”放在一起
    告诉你在第几行找到了这个学号。

  15. 退出循环
    找到了就停止重复查找。

  16. 如果“最大值” < “最小值”
    如果查找范围缩小到没有了(最小值反而比最大值大),说明找不到。

  17. 对话“未查到学号”并持续2秒
    告诉你要找的学号不存在。

  18. 停止计时器
    程序结束,计时器停止。

特别说明:

一、先理解“查找范围”

想象你手里有一排按学号从小到大排好的卡片:

位置
1
2
3
4
5
6
7
学号
2
5
8
12
15
18
21
  • 最小值:左边能查到的位置(一开始是1)

  • 最大值:右边能查到的位置(一开始是7)

查找范围就是:从“最小值”位置 到 “最大值”位置 这一块区域。


二、正常查找过程(以找学号 8 为例)

  1. 最小值=1,最大值=7
    中间位置 = (1+7)/2 = 4
    位置4的学号是12,比8大 → 所以学号8在左边 → 最大值变成4

  2. 现在最小值=1,最大值=4
    中间位置 = (1+4)/2 = 2(四舍五入)
    位置2的学号是5,比8小 → 所以学号8在右边 → 最小值变成2

  3. 现在最小值=2,最大值=4
    中间位置 = (2+4)/2 = 3
    位置3的学号是8 → 找到了!

三、为什么“差等于1”就查不到了?

关键原因在于:列表里的位置都是整数,而且程序用的是“四舍五入”取中间位置

举个例子(还是找不存在的学号10)

步骤
最小值
最大值
中间位置(四舍五入)
结果
1
1
7
6
4
12>10 → 最大值=4
2
1
4
3
2
5<10 → 最小值=2
3
2
4
2
3
8<10 → 最小值=3
4
3
4
1
(3+4)/2=3.5→4
12>10 → 最大值=3

第4步结束时:因为当差=1时,中间位置 = (3+4)/2 = 3.5 → 四舍五入 = 4
但位置3和位置4之间的“中间”已经没有整数位置可以新查了,
而且这两个位置在上一步已经比较过了,找不到就是真的找不到。