内容正文:
项目八 模拟实现商品排序——常用排序算法及其比较
参赛教师: 阳美林
沪科版 信息技术 选择性必修一
2026年道县优质教学资源评选活动
1
目录
🎯 01 情境导入
道县五中校运会的成绩排序任务!从实际需求出发,激发兴趣
🔄 02 温故知新
回顾已有知识,完成从旧知到新知的跨越
👥 03 选手登场
三位核心算法选手:冒泡、选择与插入排序
🏆 04 擂台赛
同步观察运行表现,进行详细的对比与数据分析
💭 05 总结思辨
总结算法特性,掌握不同场景下的最优选择
🚀 06 拓展与作业
知识延伸阅读,完成进阶的编程实践挑战
💡 算法感悟
算法是计算机科学的基石,而排序是算法的核心。通过排序,我们不仅能学会如何整理数据,更能领悟到优化思维的精髓。
📚 推荐阅读
1. 《算法图解》- Aditya Bhargava
2. 《排序算法动画详解》- VisuAlgo
3. LeetCode 排序专题练习
1.7.2013
本次课程我们将分为六个部分。首先,通过一个生动的情境导入,激发大家对排序问题的兴趣。接着,我们会回顾已有的知识,并引出今天的核心挑战。然后,隆重介绍我们的三位参赛选手:冒泡、选择和插入排序。接下来是激动人心的擂台赛环节,我们将同步观察它们的表现。最后,我们会进行总结思辨,并布置拓展作业。希望通过这样的安排,大家能系统地掌握排序算法的精髓。
‹#›
道县五中2025年春季运动会
高一年级百米预赛成绩(单位:秒)
12.35
11.82
13.01
12.10
11.55
问题:如何编写程序,如何快速从这组无序数据中找出前三名?
1.7.2013
想象一下,校运会刚刚结束,老师给了你一份包含五位同学百米赛跑成绩的混乱数据:78秒、92秒、65秒、88秒和73秒。
现在有一个紧急任务,需要你立刻找出跑得最快的前三名。面对这组毫无头绪的数据,你会怎么做呢?
这就是我们今天要解决的核心问题——排序。
‹#›
从旧知到新知
📚 已有知识沉淀
01. 数组存储数据
scores = [12.35, 11.82, 13.01, 12.10, 11.55]将一组离散的数值有序地存入内存
02. 循环查找最大值
int max = arr[0];
for(int i=1; i<len; i++) { ... }
能力升级
🚀 今日核心挑战
完整排序 (Sort)
对所有数据进行系统化的、全局的重排,实现从“查找”到“整理”的能力跃迁。
1.7.2013
在过去的学习中,我们已经掌握了如何用数组存储数据,以及如何通过循环找到一组数据中的最大值。这些都是非常重要的基础。
今天,我们要将这个能力进行扩展,从仅仅找到一个最大值,升级为对整个数组进行“完整排序”,让所有数据都按照我们想要的顺序排列。
这就是我们今天的挑战,也是算法学习中非常关键的一步进阶。
‹#›
擂台赛预告:三位“选手”登场
冒泡排序
核心思想:相邻元素两两比较,若逆序则交换,如同气泡不断上浮至水面。
选择排序
核心思想:每次从未排序部分中精准选出最小(或最大)的元素,将其交换到当前未排序序列的起始位置。
插入排序
核心思想:将数组中的每个元素依次插入到前面已经排好序的序列中的合适位置,就像我们平时整理扑克牌一样。
任务预告:我们将使用“排序算法观察记录表”,详细记录每一位“选手”在排序过程中的比较次数和交换/移动次数。
我们的角色:裁判
1.7.2013
现在,让我们隆重请出今天擂台赛的三位选手!它们分别是:蓝色的冒泡排序,它的特点是通过相邻元素的比较和交换,让大的元素慢慢“浮”到队尾;绿色的选择排序,它擅长每次都精准地选出当前未排序部分的最小值;以及橙色的插入排序,它像整理扑克牌一样,逐个将元素插入到正确的位置。而我们,将作为裁判,仔细观察并记录它们的每一次操作。
‹#›
选手一:冒泡排序
核心思想
扫描数组,对相邻元素进行两两比较,判断大小关系。
若两个元素顺序相反(逆序),则立即交换它们的位置。
每一轮遍历结束后,当前序列中最大的元素会“浮”到末尾。
相邻比较
气泡上浮
形象比喻
如同水中气泡上升,越大的气泡受到的浮力越强,总是最先到达水面。
分步示例 (第一轮)
5
3
8
1
① 比较 5 & 3 (逆序) → 交换
结果: [3, 5, 8, 1]
② 比较 5 & 8 (正序) → 不换
结果: [3, 5, 8, 1]
③ 比较 8 & 1 (逆序) → 交换
结果: [3, 5, 1, 8]
✅ 最大数 8 已“浮”至末尾
1.7.2013
首先来看第一位选手——冒泡排序。它的核心思想非常直观:就是不断地比较相邻的两个元素,如果它们的顺序错了,就交换它们。这个过程就像水里的气泡一样,大的气泡会慢慢浮到水面。
我们来看这个例子,数组[5, 3, 8, 1],经过第一轮的相邻比较和交换,最大的数字8就被成功地“浮”到了最后一位。
‹#›
选手二:选择排序
💡 核心思想
🎭 形象比喻
如同在杂乱的方块中
挑选出最小的那个
📊 第一轮示例
1. 将数组分为已排序和未排序两部分。
2. 每次从未排序区找到最小值。
3.将其交换到当前未排序序列的起始位置。
“选出最小
放到队首”
5
3
8
1
Step 1. 扫描
遍历数组,锁定最小值为 1。
Step 2. 交换
交换 5 和 1 → [1, 3, 8, 5]。
✅ 第一轮结束:1 就位
1.7.2013
接下来是第二位选手——选择排序。它的策略更为“果断”。它会将数组想象成两部分,一部分是已经排好序的,另一部分是未排序的。每一轮,它都会在未排序的部分里仔细寻找,找到那个最小的元素,然后直接把它和未排序部分的第一个元素交换位置。看这个例子,第一轮它就找到了最小值1,并把它放到了最开头,效率看起来很高。
‹#›
选手三:插入排序
核心思想
1. 初始假设:认为序列中的第一个元素是天然有序的。
2. 逐个插入:依次将后面的每个新元素,插入到前面已排序序列中的正确位置。
3. 动态调整:为了完成插入,可能需要向后移动已排序的元素以腾出空间。
“逐个插入,整理有序”
形象比喻
就像我们在玩扑克牌时,从第二张牌开始,将每一张新摸的牌插入到手中已排好序的牌组中。
分步示例 (前两步)
STEP 01
取元素 3,与已排序的 [5] 比较,插入到 5 前面。
结果: [3, 5, 8, 1]
STEP 02
取元素8,从后向前与已排序的[3,5]比较(8 > 5),位置正确,直接插入末尾。
结果: [3, 5, 8, 1]
✅ 前三个元素已完全有序
5
3
8
1
1.7.2013
最后一位选手是插入排序。它的工作方式就像我们平时整理扑克牌一样。
我们假设第一张牌已经是排好序的,然后从第二张牌开始,依次将它插入到前面已经排好序的牌中的正确位置。这个过程可能需要移动一些已经排好序的牌来腾出空间。
在这个例子中,它先把3插入到5前面,然后8的位置正好,所以前三个元素很快就变得有序了。
‹#›
🎬 交互式排序演示工具
🔧 工具功能
支持三种排序算法自由切换
支持自定义数组与随机数组生成
支持“自动排序”与“单步执行”两种演示模式
实时统计比较次数与交换/移动次数
📖 教学用途
教师演示:课堂现场展示数组 [5,3,8,1] 的完整排序过程
学生探究:擂台赛环节,学生自主操作网页,输入 [9,2,6,4,7] 完成观察记录,小组讨论分析课后拓展:分发网页文件,学生课后即可操作练习
💡 设计理念
将抽象算法可视化,降低理解门槛
学生从“被动观看”变为“主动探究”
与《排序算法观察记录表》配套使用,形成“观察→记录→分析”的学习闭环
擂台赛规则:我们观察什么?
比较次数
两个元素相互对比大小的次数。这是衡量算法“思考”多少的核心指标,直接反映逻辑判断的复杂度。
交换次数
两个元素互换位置的次数。这是衡量算法“动作”多少的指标,代表了数据在内存中实际的物理交换量。
移动次数
元素为腾出插入位置而向后顺移的次数。这是插入排序的关键指标,反映了不通过交换而是通过赋值来完成的数据“搬运”开销。
算法名称
比较次数
冒泡排序 (Bubble Sort)
选择排序 (Selection Sort)
插入排序 (Insertion Sort)
时间复杂度
交换/移动次数
6次
4次
6 次
2 次
5次
4 次
O(n²)
O(n²)
O(n²)
下表为示例数组 [5,3,8,1] 的完整统计,供填写参考。擂台赛探究使用数组 [9,2,6,4,7]。
初始数组:[9, 2, 6, 4, 7]
1.7.2013
在比赛开始前,我们需要明确裁判的观察规则。我们主要关注三个指标:第一,比较次数,即算法进行了多少次大小比较;第二,交换次数,即元素之间交换了多少次位置;第三,移动次数,这主要针对插入排序。这些数字将帮助我们量化评估每个算法的性能。这里有一个观察表示例,我们将在比赛中实时填写这些数据。
‹#›
同步对比擂台赛:步骤1
冒泡排序 Bubble Sort
👀 当前:比较第1个与第2个元素 (9 vs 2)
📊 统计:比较 1 次 | 交换 0 次
9
2
6
4
7
💡 解释:因为 9 > 2,发现逆序对,准备执行交换操作。
选择排序 Selection Sort
👀 当前:扫描未排序区,寻找全局最小值
📊 统计:比较 4 次 | 交换 0 次
9
2
6
4
7
💡 解释:初始假设9是最小值,与2比较后,更新最小值索引指向2。
插入排序 Insertion Sort
👀 当前:将第2个元素(2)插入已排序区 [9]
📊 统计:比较 1 次 | 移动 0 次
9
2
6
4
7
💡 解释:取出2与已排序的9比较,发现2 < 9,准备将9向后移动。
请仔细观察后续步骤,并填写《算法观察记录表》。
1.7.2013
欢迎来到第一轮的第一次比较。我们来看一下三种算法的初始状态。
首先是冒泡排序,它正在比较第一个元素9和第二个元素2。因为9大于2,它准备进行交换。
接下来是选择排序,它正在扫描整个数组寻找最小值。它首先假设第一个元素9是最小值,然后将它与第二个元素2比较,发现2更小,于是更新最小值为2。
最后是插入排序,它准备将第二个元素2插入到前面已排序的序列[9]中。它比较2和9,发现2更小,所以准备将9向后移动一位,为插入2腾出空间。
‹#›
同步对比擂台赛:步骤1
冒泡排序 Bubble Sort
👀 当前:比较第1个与第2个元素 (9 vs 2)
📊 统计:比较 1 次 | 交换 1 次
9
2
6
4
7
💡 解释:因为 9 > 2,发现逆序对,准备执行交换操作。
选择排序 Selection Sort
👀 当前:扫描未排序区,寻找全局最小值
📊 统计:比较 4次 | 交换 1 次
9
2
6
4
7
💡 解释:初始假设9是最小值,与2比较后,更新最小值索引指向2。
插入排序 Insertion Sort
👀 当前:将第2个元素(2)插入已排序区 [9]
📊 统计:比较 1 次 | 移动 1 次
9
2
6
4
7
💡 解释:取出2与已排序的9比较,发现2 < 9,准备将9向后移动。
请仔细观察后续步骤,并填写《算法观察记录表》。
1.7.2013
欢迎来到第一轮的第一次比较。我们来看一下三种算法的初始状态。
首先是冒泡排序,它正在比较第一个元素9和第二个元素2。因为9大于2,它准备进行交换。
接下来是选择排序,它正在扫描整个数组寻找最小值。它首先假设第一个元素9是最小值,然后将它与第二个元素2比较,发现2更小,于是更新最小值为2。
最后是插入排序,它准备将第二个元素2插入到前面已排序的序列[9]中。它比较2和9,发现2更小,所以准备将9向后移动一位,为插入2腾出空间。
‹#›
同步对比擂台赛:步骤2
冒泡排序 Bubble Sort
👀 当前:比较第2个与第3个元素
(9 vs 6)
📊 统计:比较 2 次 | 交换1 次
9
2
6
4
7
💡 解释:因为 9 > 6,发现逆序,准备进行交换操作。
选择排序 Selection Sort
👀 当前:扫描中,最小值2
vs 下一个元素6
📊 统计:比较 7次 | 交换 1 次
9
2
6
4
7
💡 解释:比较结果 2 < 6,当前扫描到的最小值仍然是 2,继续扫描。
插入排序 Insertion Sort
👀 当前: 取第3个元素(6),准备插入有序区[2, 9]
📊 统计:比较 3 次 | 移动 1 次
9
2
6
4
7
💡 解释: 比较6和9,6 < 9,将9向后移动一位。为后续将6插入到正确位置腾出空间。
请仔细观察后续步骤,并填写《算法观察记录表》。
1.7.2013
欢迎来到第一轮的第一次比较。我们来看一下三种算法的初始状态。
首先是冒泡排序,它正在比较第一个元素9和第二个元素2。因为9大于2,它准备进行交换。
接下来是选择排序,它正在扫描整个数组寻找最小值。它首先假设第一个元素9是最小值,然后将它与第二个元素2比较,发现2更小,于是更新最小值为2。
最后是插入排序,它准备将第二个元素2插入到前面已排序的序列[9]中。它比较2和9,发现2更小,所以准备将9向后移动一位,为插入2腾出空间。
‹#›
同步对比擂台赛:步骤2
冒泡排序 Bubble Sort
👀 当前:比较第2个与第3个元素
(9 vs 6)
📊 统计:比较 2 次 | 交换2 次
9
2
6
4
7
💡 解释:因为 9 > 6,发现逆序,准备进行交换操作。
选择排序 Selection Sort
👀 当前:扫描中,最小值2
vs 下一个元素6
📊 统计:比较 7次 | 交换 2次
9
2
6
4
7
💡 解释:比较结果 2 < 6,当前扫描到的最小值仍然是 2,继续扫描。
插入排序 Insertion Sort
👀 当前: 取第3个元素(6),准备插入有序区[2, 9]
📊 统计:比较 3 次 | 移动 2 次
9
2
6
4
7
💡 解释: 比较6和9,6 < 9,将9向后移动一位。为后续将6插入到正确位置腾出空间。
请仔细观察后续步骤,并填写《算法观察记录表》。
1.7.2013
欢迎来到第一轮的第一次比较。我们来看一下三种算法的初始状态。
首先是冒泡排序,它正在比较第一个元素9和第二个元素2。因为9大于2,它准备进行交换。
接下来是选择排序,它正在扫描整个数组寻找最小值。它首先假设第一个元素9是最小值,然后将它与第二个元素2比较,发现2更小,于是更新最小值为2。
最后是插入排序,它准备将第二个元素2插入到前面已排序的序列[9]中。它比较2和9,发现2更小,所以准备将9向后移动一位,为插入2腾出空间。
‹#›
探究任务:完成擂台赛观察记录
🔍任务说明:
教师已完成第1轮第1次和第2次比较的示范。现在,请打开桌面上的“排序算法演示网页”,以小组为单位完成以下探究任务:
📌 操作步骤
在网页输入框中输入:9, 2, 6, 4, 7
点击“应用数据”
分别切换“冒泡排序”“选择排序”“插入排序”
点击“自动排序”或“单步”,观察完整排序过程
小组讨论,完成《排序算法观察记录表》剩余部分
❓ 核心问题
哪种算法的比较次数最少?
哪种算法的交换/移动次数最少?
如果数据已经基本有序,你会选择哪种算法?为什么?
1.7.2013
经过多轮激烈的比赛,三位选手都完成了对示例数组的排序任务。现在,我们来看一下最终的成绩单。
从比较次数来看,冒泡排序和选择排序都进行了10次比较,而插入排序只进行了7次,表现出了更高的效率。但从交换或移动次数来看,选择排序只进行了1次交换,是三者中最少的;而插入排序的移动次数最多,达到了9次。
这说明不同的算法在不同的指标上表现各异。接下来,我们将基于这两个核心指标,对三位选手进行最终的综合裁决。
‹#›
擂台赛进程小结
🛎️ 比赛进程回顾
三位选手均已完美完成数组 [9, 2, 6, 4, 7] 的排序,最终成绩单如下:
算法 比较次数 交换 / 移动次数
冒泡排序 10 次 4 次
选择排序 10 次 1 次
插入排序 7 次 9 次
核心指标:比较次数
衡量算法时间效率的最直观维度
关键指标:交换/移动次数
决定算法实际运行时的性能开销
各组已完成探究,现在汇总数据,公布参考结果。
1.7.2013
经过多轮激烈的比赛,三位选手都完成了对示例数组的排序任务。现在,我们来看一下最终的成绩单。
从比较次数来看,冒泡排序和选择排序都进行了10次比较,而插入排序只进行了7次,表现出了更高的效率。但从交换或移动次数来看,选择排序只进行了1次交换,是三者中最少的;而插入排序的移动次数最多,达到了9次。
这说明不同的算法在不同的指标上表现各异。接下来,我们将基于这两个核心指标,对三位选手进行最终的综合裁决。
‹#›
场景思辨1:数据量非常小
场景:数据量很小
数据特征描述
待排序的元素个数处于极低水平,例如仅有5个或10个元素。数据规模的微小导致算法的时间复杂度差异难以体现。
🤔 决策流程:如何选择?
1. 检查数据规模
如果待排序元素通常在10个以内”或“只有寥寥数个(如少于10个),即可判定为“小数据模式”。
2. 评估算法特性
• 冒泡排序:代码最简单,逻辑直观,易于记忆和书写。
• 插入排序:在数据基本有序时,拥有最高的实际运行效率。
• 选择排序:元素交换次数最少,适合内存写入敏感的场景。
3. 综合决策
无需纠结复杂度,优先选择自己最熟悉、代码最简洁或当前项目中已广泛使用的算法,以保持代码风格统一的算法。
1.7.2013
现在我们来进行一个思辨:如果待排序的数据量非常小,比如只有几个元素,我们应该选择哪种算法呢?在这种情况下,各种算法的时间复杂度差异其实并不明显。这时候,选择的标准就变成了哪个算法最简单、最容易实现。冒泡排序的代码最简单,容易记忆;插入排序在数据基本有序时效率最高;而选择排序的交换次数最少。因此,在小数据量场景下,我们通常会优先选择自己最熟悉、代码最简洁的算法。
‹#›
场景思辨2:数据基本有序
场景:数据基本有序
数据特征描述
待排序的数据已经“大致排好”,仅有少量元素位置不正确。例如:[2, 3, 8, 5, 9],只有5和8位置颠倒,其余均已有序。
🤔 决策流程:如何选择?
1. 检查数据有序度
如果数据“几乎排好”,只有个别元素错位,即为“基本有序”场景。
2. 评估算法特性
插入排序:对基本有序数据效率极高,比较和移动次数大幅减少,接近O(n)。
冒泡排序:仍需多轮遍历,效率提升不明显。
选择排序:无论数据是否有序,比较次数固定,无优势。
3. 综合决策
首选插入排序。它在基本有序场景下性能最优,是实际应用中的常见选择。
1.7.2013
现在我们来进行一个思辨:如果待排序的数据量非常小,比如只有几个元素,我们应该选择哪种算法呢?在这种情况下,各种算法的时间复杂度差异其实并不明显。这时候,选择的标准就变成了哪个算法最简单、最容易实现。冒泡排序的代码最简单,容易记忆;插入排序在数据基本有序时效率最高;而选择排序的交换次数最少。因此,在小数据量场景下,我们通常会优先选择自己最熟悉、代码最简洁的算法。
‹#›
算法特性综合对比
算法名称
核心思想
稳定性
适用场景
冒泡排序
相邻元素两两比较,像气泡一样上浮
稳定
数据基本有序 / 算法教学演示
选择排序
每次在未排序部分,选出最小元素,与当前队首元素交换。
不稳定
数据交换成本较高的特殊场景
插入排序
将未排序部分的元素逐个取出,插入前面已整理好的有序区。
稳定
数据量较小 / 数据基本有序的场景
没有最优的算法,只有最适合的场景
这正是我们学习多种算法的意义所在:审场景,择优法。
1.7.2013
现在我们对三种算法进行一个综合对比。从核心思想、稳定性和适用场景来看,它们各有优劣。冒泡排序和插入排序是稳定的排序算法,而选择排序是不稳定的。冒泡排序适合教学演示,选择排序适合数据交换成本高的场景,而插入排序在数据量小或基本有序时表现最佳。通过今天的学习,我们得出一个非常重要的结论:没有绝对最优的算法,只有针对特定场景最适合的算法。选择算法的过程,就是一个权衡和决策的过程。
‹#›
工程思维升华:审场景,择优法
审场景
择优法
分析需求
明确数据量量级,判断数据本身是否具有天然的有序性。
评估算法
对比不同算法的时间复杂度与空间复杂度,进行综合权衡。
测试优化
运行压测程序验证性能,根据反馈结果进行迭代与优化。
择优实现
选定最优解,结合实际工程环境编写高效、健壮的代码。
1.7.2013
通过今天的学习,我们不仅掌握了三种排序算法,更重要的是培养了一种工程思维:那就是“审场景,择优法”。在实际开发中,我们首先要分析需求,了解数据的规模和特性。然后,评估不同算法的优劣,进行综合权衡。接着,通过测试来验证我们的选择,并根据结果进行优化。最后,选择最合适的算法来实现功能。这种思维方式将贯穿我们整个编程生涯。
‹#›
知识拓展:更快的排序算法
如果要对10000个甚至100万数据排序,今天的方法还够快吗?
核心思想:分而治之
将大问题递归分解为小问题,分别解决后再合并。
代表算法:快速排序、归并排序
核心思想:减少比较
利用数据的范围、分布等特定结构,减少比较或直接定位。
代表算法:希尔排序、堆排序
算法效率演进阶梯:O(n²)→O(n log n)→O(n)(在特定条件下)
(冒泡 / 选择 / 插入) (快速 / 归并 / 堆排) (桶排 / 计数排)
1.7.2013
今天我们学习的三种算法,时间复杂度都是O(n²)级别。那么大家可能会问,如果要处理的数据量非常大,比如一万甚至一百万个数据,这些算法还够用吗?答案是不够的。
计算机科学家们已经发明了更高效的排序算法,它们的核心思想主要有两种:一种是“分而治之”,比如快速排序和归并排序,它们的时间复杂度可以达到O(n log n);另一种是“减少比较”,比如希尔排序和堆排序。
未来我们还会学习到时间复杂度为O(n)的线性排序算法。算法的世界,永无止境。
‹#›
课堂总结:我们的收获
课程回顾
基础知识夯实
• 掌握线性表、树等数据结构基础
• 深入理解时间/空间复杂度分析模型
• 熟悉内存分配与计算机存储底层原理
核心排序算法
•冒泡排序:相邻比较,气泡上浮
•选择排序:选出最小,放到队首
•插入排序:逐个插入,整理有序
算法设计思想
• 基于比较次数与交换次数的效率评估体系
• 算法稳定性与空间复杂度之间的权衡艺术
• 初步建立贪心策略与分治思想的解题思维
工程应用落地
• 业务数据的多维度排序与筛选
• 游戏/应用中的实时排行榜更新
• 文件系统中按名称、日期、大小的快速整理
1.7.2013
好了,让我们来总结一下今天的收获。我们不仅复习了数据结构、算法复杂度等基础知识,还深入学习了冒泡、选择和插入三种排序算法。我们理解了如何通过比较次数和交换次数来评估算法效率,以及如何权衡稳定性和空间复杂度。更重要的是,我们接触到了贪心策略和分治思想这些高级算法思想。这些知识在数据展示、数据库优化、游戏开发等领域都有广泛的应用。希望大家能将今天所学应用到实际问题中。
‹#›
分层作业:巩固与提升
A层 · 基础巩固
📝 核心任务 I
默写三种核心排序算法(如冒泡、选择、插入)的标准伪代码。
🧠 核心任务 II
手动模拟排序过程,对数组 [8, 1, 5, 3, 7] 进行完整的升序排序推演。
B层 · 进阶应用
💻 代码实战 I
使用 Python 语言完整实现你熟悉的一种排序算法,并验证其正确性。
❓ 深度思考 II
分析并回答:请用一个具体的数值例子,说明“选择排序”的不稳定性。
C层 · 挑战创新
🚀 算法优化 I
尝试优化基础冒泡排序,实现“鸡尾酒排序”(双向冒泡),并分析其相比基础冒泡排序的改进之处(例如,对“乌龟”慢速移动问题的优化)。
🔍 前沿探索 II
查阅资料深入了解“计数排序”的核心思想,思考它在什么特定数据场景下效率最高(如整数范围不大时)。
1.7.2013
为了巩固今天的学习成果,我为大家布置了分层作业。A层是基础巩固,要求大家默写伪代码并手动模拟排序过程。B层是进阶应用,需要大家用Python实现一种算法,并深入思考选择排序的不稳定性。C层是挑战创新,鼓励大家去探索更高级的排序算法,如鸡尾酒排序和计数排序。大家可以根据自己的情况选择适合的层级来完成,希望大家能在实践中加深理解。
‹#›
编程实践建议:以Python为例
📝 插入排序 Python 实现
def insertion_sort(arr):
"""插入排序(升序)"""
n = len(arr)
# 从第二个元素开始,视为待插入的元素
for i in range(1, n):
key = arr[i] # 当前待插入的元素
j = i - 1 # 从已排序部分的末尾开始比较
# 将大于key的元素依次后移
while j >= 0 and arr[j] > key:
arr[j + 1] = arr[j]
j -= 1
arr[j + 1] = key # 将key插入到正确位置
return arr
任务一:算法复现
参考上方代码结构,独立编写冒泡排序与选择排序的函数实现,体会不同算法的逻辑差异。
任务二:数据验证
在代码中添加计数变量,分别统计排序过程中的“比较次数”与“移动次数”,量化验证算法效率。
任务三:性能实战
生成一个包含100个随机整数的列表,使用不同算法进行排序,直观感受大数据量下的效率差异,并思考其背后的原因。。
1.7.2013
这里我给大家提供一个用Python实现插入排序的示例代码。大家可以参考这个结构,尝试自己编写冒泡排序和选择排序的代码。在编写过程中,建议大家添加一些计数变量,来统计比较次数和移动次数,这样可以更直观地验证我们今天得出的结论。更进一步,大家可以生成一个包含大量随机数的列表,用不同的算法去排序,亲身体验一下它们在大数据量下的性能差异。
‹#›
从无序到有序,我们探索规律。
从比较到交换,我们优化策略。
从 O(n²) 到更优解,我们永远在路上。
下节课预告:项目九——查找算法初探
1.7.2013
最后,我想用三句话来总结我们今天的学习历程:从无序到有序,我们探索规律;从比较到交换,我们优化策略;从O(n²)到更优解,我们永远在路上。算法的学习是一个不断探索和优化的过程。今天我们只是迈出了第一步。下节课,我们将继续探索更高效的排序算法——快速排序,它将带领我们进入“分而治之”的思想世界。谢谢大家!
‹#›
板书设计 · 三大排序算法
冒泡排序 (Bubble)
💡 核心口诀
相邻两两比较,
较小元素气泡上浮。
⚙️ 算法特点
稳定,但交换次数多。
选择排序 (Selection)
💡 核心口诀
选出最小,放到队首。
⚙️ 算法特点
不稳定,但交换次数最少。
插入排序 (Insertion)
💡 核心口诀
逐个取出插入,
整理成有序序列。
⚙️ 算法特点
稳定,对基本有序数据效率极高。
💡 核心结论:没有绝对“最优”的算法,只有针对特定场景“最适合”的算法。
1.7.2013
这是我们今天课程的板书设计,总结了三种排序算法的核心口诀和特点。冒泡排序的关键是“相邻比较,气泡上浮”;选择排序是“选出最小,放到队首”;插入排序则是“逐个插入,整理有序”。大家要记住它们各自的特点,比如冒泡和插入是稳定的,而选择是不稳定的。最重要的是要记住我们的核心结论:没有最好的算法,只有最适合的算法。希望大家能牢记这些知识点。
‹#›
感谢观看
执教教师:阳美林
学校:道县第五中学
授课日期:2026年4月
1.7.2013
再次感谢大家的观看和参与。如果大家在学习过程中有任何疑问,欢迎通过屏幕上的联系方式与我交流。今天课程的参考资料主要来自《数据结构与算法》等经典教材。希望大家课后能继续深入学习,不断提升自己的编程能力。谢谢大家!
‹#›
$