第12课 查找与排序——让数据排好队,找得更快 教学设计+html素材 小学信息科技Python程序设计

资源下载
  1. 二一教育资源

第12课 查找与排序——让数据排好队,找得更快 教学设计+html素材 小学信息科技Python程序设计

资源简介

/ 让教学更有效 精品试卷 | 信息
小学四—五年级 Python 程序设计(第一学期)
教 学 设 计
第12课 查找与排序——让数据排好队,找得更快
课  题 第12课 查找与排序——让数据排好队,找得更快
课  时 第 12 课时(40 分钟)
课  型 算法专题 + 竞赛衔接
教学环境 机房(Windows + Python 3.x + IDLE/Thonny)
授课班级 四年级、五年级
一、学情分析
学生在第 8 课已经接触过顺序查找与冒泡排序的雏形,也在第 11 课建立了枚举思想。本课把这两项高频操作系统化、并引入一个真正「聪明」的算法——二分查找。
学生的认知难点有三处:
1.不理解二分查找为什么必须先排好序;
2.对 mid = (low + high) // 2 与 low/high 的更新方向容易搞反;
3.分不清「顺序查找」和「二分查找」各自适用什么场合。
本课用「查字典」「猜数字 1~100 最少几次能猜中」两个情境,让「折半」的威力变得可感:100 个数只需 7 次。
二、教学目标
(一)知识目标
1.掌握顺序查找的完整写法,理解其最坏情况要比较 n 次。
2.掌握二分查找的前提(有序)与过程(取中间、比较、折半)。
3.掌握冒泡排序的完整实现,理解排序与查找的依存关系。
(二)能力目标
1.能独立写出二分查找程序,并正确维护 low、high、mid 三个变量。
2.能说出二分查找比顺序查找快在哪里,并估算查找次数。
(三)素养目标
1.体会算法效率的巨大差异,形成「同样能解决问题,但有好坏之分」的意识。
2.感受「折半」这一数学思想在生活中的普遍存在。
三、教学重点与难点
项 目 内 容
教学重点 二分查找的三个指针 low/high/mid 的维护;while low <= high 循环条件;冒泡排序的完整实现。
教学难点 二分查找中更新方向(比目标小则 low = mid+1,大则 high = mid-1);循环终止条件;为什么必须先排序。
四、教学准备
· 教师:课件、1~100 数字卡片(演示折半)、有序与无序对照表。
· 学生:练习卷、上机账号。
· 素材:本课 5 个程序文件 1顺序查找.py ~ 5二分查找次数对比.py。
五、教学过程(共 40 分钟)
环节一 情境导入:猜数字(6 分钟)
教师说:「我心里想了一个 1~100 的数,你来猜,我只会说『大了』或『小了』。你最少要几次才能必定猜中?」
请学生上台实际猜一次。多数学生会从 1 开始一个个猜——教师引导:「如果每次都从中间猜呢?」
现场演示:猜 50 → 75 → 88 → 94 → 97 → 99 → 100。结论:每次砍掉一半,100 个数最多 7 次必定命中。
对比:一个一个猜最坏要 100 次。7 次 vs 100 次,差距惊人。这就是本课的主角——二分查找。
【设计意图】「猜数字」是学生最熟悉的游戏,用亲身参与的体验引出效率差距,比讲时间复杂度有效得多。
环节二 复习与对照:顺序查找(6 分钟)
演示 1顺序查找.py,快速回顾第 8 课内容。
a = [60, 75, 88, 92, 95]
target = 88
pos = -1
for i in range(len(a)):
if a[i] == target:/n pos = i
break
print(pos + 1 if pos >= 0 else "没找到")
一句话概括:从头到尾一个一个比,找到就停。它的优点是「不要求数据有序」,缺点是最坏要找 n 次。
对照表(板书):
对比项 顺序查找 二分查找
数据要求 随便什么顺序 必须已经排好序
基本动作 一个一个比 取中间、砍一半
最坏比较次数(100 个数) 100 次 7 次
适用场合 数据少、或没排序 数据多且已排序
环节三 新授:二分查找的实现(13 分钟)
先讲清三个指针的含义(板书画数轴):
下标: 0 1 2 3 4 5 6 7 8
数值: 11 22 33 44 55 66 77 88 99
↑ ↑ ↑
low mid high
low = 待查找范围的左端
high = 待查找范围的右端
mid = 中间位置 (low + high) // 2
演示 2二分查找.py。
a = [11, 22, 33, 44, 55, 66, 77, 88, 99]
target = 77
low, high = 0, len(a) - 1
ans = -1
while low <= high:/n mid = (low + high) // 2
if a[mid] == target:/n ans = mid
break
elif a[mid] < target: # 中间的数太小,目标一定在右半边
low = mid + 1
else: # 中间的数太大,目标一定在左半边
high = mid - 1
print(ans + 1 if ans >= 0 else "没找到")
逐步模拟 target = 77(让学生跟着画):
轮次 low high mid a[mid] 比较结果
1 0 8 4 55 55 < 77 → low = 5
2 5 8 6 77 找到了!
关键提问一:为什么是 low = mid + 1,而不是 low = mid?→ 因为 a[mid] 已经不相等了,把中点也排除掉,否则可能死循环(low 一直不动)。
关键提问二:while 的条件为什么是 low <= high,写成 low < high 会怎样?→ 当范围只剩一个数时 low == high,此时还需再比一次;写成 < 就会漏掉最后一个数。
关键提问三:如果列表没排序,二分还能用吗?→ 不能。「中间的数比目标小就说明目标在右半边」这个推理只有在有序时才成立。这是二分查找的铁律。
可以举一个反例当场验证:把列表打乱再跑二分,让它找不到明明存在的数,印象最深。
环节四 冒泡排序的完整实现(10 分钟)
演示 4冒泡排序完整.py,把第 8 课的雏形补全。
a = [64, 25, 12, 22, 11]
n = len(a)
for i in range(n - 1):
swapped = False
for j in range(n - 1 - i):
if a[j] > a[j + 1]:
a[j], a[j + 1] = a[j + 1], a[j]
swapped = True
if not swapped: # 一轮下来没换过,说明已经有序
break
print(a)
新增的 swapped 变量是一个优化:如果某一轮从头比到尾一次都没交换,说明列表早就排好了,可以直接提前结束。对已经有序的列表,这个优化让程序从 n 轮降到 1 轮。
再次强调排序与查找的依存关系:「想用二分查找,就必须先排序——排序是查找的前置工序。」
环节五 效率对比与总结(5 分钟)
演示 5二分查找次数对比.py,用计数器实测两种查找的比较次数。
def seq_steps(a, t):
c = 0
for x in a:/n c += 1
if x == t:/n break
return c
def bin_steps(a, t):
low, high, c = 0, len(a) - 1, 0
while low <= high:/n c += 1
mid = (low + high) // 2
if a[mid] == t:/n break
elif a[mid] < t:/n low = mid + 1
else:/n high = mid - 1
return c
a = list(range(1, 1025))
t = 1024
print("顺序查找:", seq_steps(a, t), "次")
print("二分查找:", bin_steps(a, t), "次")
结果:1024 个数里找最后一个,顺序查找要 1024 次,二分查找只要 11 次——差了近百倍。
规律:二分查找的次数约等于 log n。1024 是 2 的 10 次方,所以大约 10~11 次。不必深究对数,只让学生记住「每砍一半,次数加一」。
本课一句话总结:顺序查找「老实」,一个一个比,不挑数据;二分查找「聪明」,每次都砍一半,但必须先排好序。排序是为了查找,查找要靠排序——它们是一对好搭档。
六、板书设计
第12课 查找与排序
顺序查找:一个一个比,不要求有序,最坏 n 次
二分查找(必须有序)
low, high = 0, len(a)-1
while low <= high:/n mid = (low + high) // 2
a[mid] == t → 找到
a[mid] < t → low = mid + 1
a[mid] > t → high = mid - 1
每砍一半,范围减半
100 个数 → 最多 7 次
1024 个数 → 最多 11 次
冒泡排序:swapped 提前结束
七、分层作业
★ 完成练习卷第一、二、三题(填空、判断、手算模拟)。
★★ 完成练习卷第四题:写出顺序查找程序;手写二分查找的完整代码并用测试数据验证。
★★★ 完成练习卷第五题:随机生成 20 个 1~100 的整数,先用冒泡排序排好,再分别用顺序查找和二分查找查找同一个数,打印各自的比较次数并比较。
八、教学反思要点
1.「每次砍一半」这一直觉有多少学生真正建立?猜数字演示是否要请更多学生参与?
2.low = mid + 1 中的「+1」是否是本课最大难点?是否需要设计一个去掉 +1 的报错演示?
3.学生是否理解二分查找必须先排序?反例演示的效果如何?
4.冒泡排序的 swapped 优化是否讲得过深?对学得快的学生是否合适?
课后记(教师填写):
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
21世纪教育网 www.21cnjy.com 精品试卷·第 2 页 (共 2 页)
21世纪教育网(www.21cnjy.com)

展开更多......

收起↑

资源预览