B2.4 · 排序 · 当前学习重点

冒泡排序与选择排序

跟踪每一轮如何将数值移向最终位置,再实现并比较两种排序。

55 分钟

本节课资源

Python · 逐步执行

冒泡排序

跟随实际的 Python 执行过程,观察列表的变化。

选择“播放”或“下一行”,跟踪 Python 的执行过程。

Python 实现

高亮表示下一条将执行的语句。数值显示执行该行之前的状态。

def bubble_sort(items):    for end in range(len(items) - 1, 0, -1):        swapped = False        for j in range(end):            if items[j] > items[j + 1]:                items[j], items[j + 1] = items[j + 1], items[j]                swapped = True        if not swapped:            break    return items

end 之后的后缀已经排好序。提前终止标志使最佳情况的时间复杂度为 O(n);平均与最坏情况为 O(n²)。此原地实现使用 O(1) 辅助空间。

Python · 逐步执行

选择排序

跟随实际的 Python 执行过程,观察列表的变化。

选择“播放”或“下一行”,跟踪 Python 的执行过程。

Python 实现

高亮表示下一条将执行的语句。数值显示执行该行之前的状态。

def selection_sort(items):    for start in range(len(items) - 1):        smallest = start        for j in range(start + 1, len(items)):            if items[j] < items[smallest]:                smallest = j        items[start], items[smallest] = items[smallest], items[start]    return items

找出剩余元素中的最小值,再将其交换到正确位置。start 之前的前缀已排序。即使输入已有序,比较的时间复杂度仍为 O(n²)。辅助空间为 O(1)。

学完本节课后

  • 逐轮跟踪冒泡排序与选择排序。
  • 区分比较与交换。
  • 测试空列表、有序列表、逆序列表及含重复值的列表。

完成本节课

01 · 5 分钟

回顾

解释有序数据为什么使二分搜索成为可能。预测仅进行一次小规模搜索时,先排序是否值得。

02 · 15 分钟

跟踪冒泡排序

使用 [7, 2, 5, 1]。比较相邻值,必要时交换。记录每轮后的列表,并解释哪些元素已处于最终位置。

03 · 15 分钟

跟踪选择排序

使用相同的初始列表。找出剩余最小值,将其交换到下一个位置。分别记录比较与交换。

04 · 15 分钟

实现与测试

不使用 sorted() 或 list.sort() 实现一种排序。测试 []、[4]、已排序列表、逆序列表及重复值。

05 · 5 分钟

比较

用跟踪记录作为证据,解释两种算法的一个区别。

下课前

离堂问题

每轮都重复什么工作?随着列表变大,这些工作如何变化?

本主题作业

截止日期:2026 年 10 月 12 日 · 第 3–7 题 · 已布置

假期作业:完成第 3–7 题

假期期间完成 B2.4 算法学生讲义第 3–7 题中尚未完成的内容。第 1、2 题已经完成。

截止日期:2026年10月7日 · 第9(a)题 + 第10题(仅冒泡排序部分)· 已布置

冒泡排序:第9(a)题及第10题的冒泡排序部分

完成 B2.4 算法学生讲义印刷页码第11页的第9(a)题,以及第12页第10题中仅涉及冒泡排序的部分。截止日期为2026年10月7日。