高中信息技术教学案例:如何用“打擂台”和“冒泡”讲透冒泡排序

共 2776字,需浏览 6分钟

 ·

2026-06-08 17:51

一、项目背景

  • 课程名称:高中信息技术·算法与程序设计
  • 授课对象:高中一年级学生
  • 先修知识:学生已掌握Python基础语法(变量、循环、列表),了解“排序”的基本概念,但尚未接触过具体排序算法。

二、我的角色

  • 课程主讲教师、教学设计者

三、核心挑战

在教学中,我发现学生对冒泡排序的主要困惑在于:

  1. 难以理解“两两比较”的意义:不知道为什么需要反复比较。
  2. 搞不清“趟数”和“每趟次数”的关系:容易混淆内外循环的边界。
  3. 觉得算法抽象、枯燥:认为这只是数学逻辑,与生活无关。

四、我的教学方案与实施过程

为了解决上述问题,我设计了一套“生活化比喻 + 可视化演示 + 代码跟练”的教学流程。

第一步:生活化比喻,建立感性认知(5分钟)

我不会一上来就讲代码,而是先讲一个“体育课排队”的故事。

场景:体育课上,老师要求同学们按身高从矮到高(升序)排成一列。规则是:从队首开始,相邻两个人互相比较,如果前面的人比后面的人高,他们就交换位置。这样,一趟比较下来,最高的人就像“冒泡”一样,被“推”到了队伍的最后面。然后,下一趟忽略最后一人,重复上述过程,直到全部排好。

通过这个比喻,学生们立刻理解了三个核心概念:

  • 两两比较:为什么要比(为了把高的往后推)。
  • 一趟排序:一次完整的相邻比较过程。
  • 冒泡:为什么叫“冒泡”(最高的人逐步浮到末尾)。

第二步:可视化演示,直观理解过程(10分钟)

在PPT上,我使用动画分步演示一个具体例子:[5, 2, 3, 1] 的升序排列。

  • 第一趟:比较5和2 → 交换 → [2, 5, 3, 1]比较5和3 → 交换 → [2, 3, 5, 1]比较5和1 → 交换 → [2, 3, 1, 5] (第一趟结束,5已就位)
  • 第二趟:比较2和3 → 不交换 → [2, 3, 1, 5]比较3和1 → 交换 → [2, 1, 3, 5] (第二趟结束,3已就位)
  • 第三趟:比较2和1 → 交换 → [1, 2, 3, 5] (全部排序完成)

同时,我引导学生观察并总结规律:

  • 要对 n 个数字排序,最多需要 n-1 趟。
  • 每一趟比较的次数,都比上一趟少1次。

第三步:代码实现,将思路转化为程序(15分钟)

在充分理解过程后,我再带领学生将思路“翻译”成Python代码。

# 冒泡排序(升序)
def bubble_sort(arr):
   n = len(arr)
   # 外层循环控制比较的“趟数”,共需要 n-1 趟
   for i in range(n - 1):
       # 内层循环控制“每趟”的比较次数
       # 每完成一趟,最大的数就会被“冒”到最后,所以比较次数减少 i
       for j in range(n - 1 - i):
           # 如果前面的数大于后面的数,则交换位置
           if arr[j] > arr[j + 1]:
               arr[j], arr[j + 1] = arr[j + 1], arr[j]
       # 打印每一趟的结果,便于观察
       print(f"第{i+1}趟排序结果:{arr}")
   return arr

# 测试
test_list = [5, 2, 3, 1]
print(f"原始列表:{test_list}")
sorted_list = bubble_sort(test_list)
print(f"最终排序结果:{sorted_list}")

代码讲解要点

  • 内外循环的对应关系:i 代表第几趟,j 代表当前比较到的位置。
  • range(n-1-i) 的巧妙之处:直观地体现了“每趟比较次数递减”的规律。
  • 交换逻辑:Python 特有的 a, b = b, a 写法,简洁高效。

第四步:优化与讨论,培养算法思维(5分钟)

最后,我会引导学生思考算法的“效率”问题。

  • 问题:如果某趟排序中,一次交换都没发生,说明什么?(列表已经有序。)
  • 优化:我们可以加入一个标志位 swapped,如果某趟没有发生交换,则直接结束排序。

# 优化后的冒泡排序
def bubble_sort_optimized(arr):
   n = len(arr)
   for i in range(n - 1):
       swapped = False
       for j in range(n - 1 - i):
           if arr[j] > arr[j + 1]:
               arr[j], arr[j + 1] = arr[j + 1], arr[j]
               swapped = True
       if not swapped:
           print(f"第{i+1}趟未发生交换,提前结束。")
           break
   return arr

五、教学成果与反思

  • 学生反馈:通过“体育课排队”的比喻和分步动画,90%的学生能够独立说出冒泡排序的基本过程。课后编程作业中,约85%的学生能够独立或通过少量提示完成基础版冒泡排序代码。
  • 我的思考:从具体到抽象:对于初学者,必须先用生活化例子建立感性认知,再过渡到代码,效果远超直接讲授算法逻辑。可视化至关重要:过程中不可见的“数据交换”,必须通过动画或打印中间结果让其“显形”。算法思维比代码更重要:教学重点不是记住代码,而是理解“两两比较、逐步推高”的核心思想。这个思想可以迁移到许多其他问题的解决中。


浏览 1
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报