Sorting-Algorithms-Blender 一次看懂 4 种算法:堆排序、希尔排序、插入排序与选择排序的动画对比
【免费下载链接】Sorting-Algorithms-BlenderSorting algorithms visualized using the Blender Python API.项目地址: https://gitcode.com/gh_mirrors/so/Sorting-Algorithms-Blender
想真正看懂排序算法,光看代码远远不够。Sorting-Algorithms-Blender是一个用 Blender Python API 把经典排序算法变成 3D 动画的开源项目:每个数字是一根立方体柱子,柱子高低代表数值大小,排序过程中柱子不断交换位置,整个过程以关键帧动画的形式呈现在你眼前。本文就用它来一次看懂堆排序、希尔排序、插入排序与选择排序这 4 种算法的动画对比,帮你从"死记代码"升级为"看懂过程"。
📌 本文面向新手与普通用户,不贴大段代码,只讲思路、看动画、比效率。
什么是 Sorting-Algorithms-Blender?
Sorting-Algorithms-Blender 的原理很简单:运行项目里的某个 Python 脚本,Blender 就会自动生成一批基础网格物体(立方体),并按照排序算法执行时数组元素的位置变化,逐帧插入关键帧,最终生成一段完整的排序算法动画。
它最大的亮点有两个:
- 🔍动画还原过程:不是只给结果,而是把每一轮比较、每一次交换都演给你看。
- 📊内置计数器:画面上还会实时显示"比较次数"和"数组访问次数",让你直观感受算法的工作量。
4 种可视化方式怎么选?sort_scale 目录最直观
项目把可视化脚本分成 4 个文件夹,对应 4 种不同的表现手法:
| 文件夹 | 数值如何表示 | 位置如何表示 | 额外特性 |
|---|---|---|---|
sort_circle | 材质 HSV 颜色 | 长方体旋转角度 | 颜色环 |
sort_color | 材质红绿通道 | 平面位置 | 自定义渐变色 |
sort_combined | 材质颜色 | 平面位置 | 多个二维数组拼成立方体 |
sort_scale | 立方体高度(缩放) | 立方体位置 | 比较次数 + 数组访问计数器 |
如果你第一次接触这个项目,建议从sort_scale目录入手:柱子越高数值越大,柱子左右移动就是元素交换,一眼就能看懂。本文介绍的 4 种算法,在sort_scale里都有对应的脚本:
sort_scale/heap_sort_scale.pysort_scale/shell_sort_scale.pysort_scale/insertion_sort_scale.pysort_scale/selection_sort_scale.py
3 步快速上手:在 Blender 里运行排序算法动画
想在本地亲眼看到这些动画,只需要 3 步:
- 安装并启动 Blender(官网免费下载,跨平台支持)。
- 打开 Blender 的Text Editor(文本编辑器),载入上述任意一个
.py脚本。 - 点击运行按钮,等待脚本自动创建物体、插入关键帧,然后播放动画即可。
项目源码可以通过 git clone 获取:
git clone https://gitcode.com/gh_mirrors/so/Sorting-Algorithms-Blender如果只是想快速体验,建议先跑sort_scale下的脚本,动画最直白、反馈最清晰。🎬
堆排序动画:二叉堆的"建堆—取根"之旅
堆排序基于二叉堆数据结构,整个过程可以分成两段看:
- 建堆:把乱序数组调整成一个最大堆(父节点大于子节点)。
- 取根:反复把堆顶的最大值"扔"到数组末尾,再对剩余部分重新堆化。
在动画里,你会看到柱子先是"层层调整"地堆出金字塔结构,然后最高的一根柱子被不断取出、放到末尾,剩下的部分继续重新排列。整个过程环环相扣,非常像"从金字塔顶端不断抽走最大的砖块"。
堆排序最厉害的地方在于:它的最好、平均、最坏情况时间复杂度都是O(n log n),而且空间复杂度只有O(1),属于"又稳又快"的选手。
💡 观看技巧:注意动画后期,柱子会从右往左逐渐"定格",那就是已经排好的部分。
希尔排序动画:让插入排序"跳着走"
希尔排序可以理解为插入排序的升级版。普通插入排序每次只能把元素移动一格,而希尔排序先按一个较大"间隔(gap)"把数组分成若干子序列,各自做插入排序,然后逐步缩小间隔,直到间隔为 1 完成最终排序。
动画中你会看到非常独特的画面:柱子不是相邻元素两两交换,而是隔着好几根柱子跳跃式比较,间隔越变越小,画面从"粗犷"逐渐变得"精细",最后像普通插入排序一样收尾。
这种"先粗排、再细排"的思路,让希尔排序在中等规模数据上远快于普通插入排序,平均复杂度约O(n(log n)²),空间复杂度同为O(1)。
插入排序动画:像整理扑克牌一样
插入排序的思路人人都会:把数组分成"已排序区"和"未排序区",每次从未排序区取一个元素,插到已排序区合适的位置,就像打扑克时一张张理牌。
看动画时,你会看到左边柱子逐渐变得有序,每次从右边"抽"出一根柱子,一路向左"挤"过比自己高的柱子,找到自己的位置插进去。对于基本有序的数据,插入排序表现极佳,最好情况只需O(n);最坏和平均情况为O(n²),空间复杂度O(1)。
选择排序动画:每次都挑最小的
选择排序是最"老实"的算法之一:维护一个已排序区和一个未排序区,每一轮都在未排序区里扫描出最小值,然后和未排序区第一个元素交换。
动画中,你会看到每次排序都会有一根"巡视"的柱子从左到右扫过整个区域,找到最小值后把它"请"到最前面。它的特点是交换次数极少(最多 n 次交换),但无论数据是否有序,比较次数都是固定的O(n²),所以最好情况和最坏情况一样慢。
4 种排序算法动画对比:一张表看懂复杂度
看完 4 段动画,再用一张表收拢它们的效率差异(数据来自项目 README 的 Big O 复杂度表):
| 算法 | 最好情况 | 平均情况 | 最坏情况 | 空间复杂度 |
|---|---|---|---|---|
| 堆排序 | Ω(n log n) | Θ(n log n) | O(n log n) | O(1) |
| 希尔排序 | Ω(n log n) | Θ(n(log n)²) | O(n(log n)²) | O(1) |
| 插入排序 | Ω(n) | Θ(n²) | O(n²) | O(1) |
| 选择排序 | Ω(n²) | Θ(n²) | O(n²) | O(1) |
对比结论很清晰:堆排序效率上限最高且稳定;希尔排序介于两者之间,工程中很实用;插入排序对近乎有序的数据有天然优势;选择排序实现最简单,但比较次数不因数据状态而减少。
看动画时,别忘了看这两个计数器
sort_scale的脚本在动画画面下方额外渲染了两个实时计数器:
- Comparisons(比较次数):记录算法执行了多少次元素比较。
- Array Accesses(数组访问次数):记录算法读写数组的次数。
这两个数字会随着动画逐帧增长,直接告诉你"谁的运算量更大"。这也是项目作者刻意设计的:动画本身只展示元素移动轨迹,而计数器才是反映时间复杂度的直观指标。
总结:为什么推荐用动画学习排序算法?
对新手来说,排序算法最劝退的地方是"看得懂伪代码,看不懂过程"。Sorting-Algorithms-Blender 把抽象的数组操作变成了看得见的柱子移动:
- ✅ 堆排序让你看懂"建堆—取根"的循环结构;
- ✅ 希尔排序让你理解"间隔递减"的跳跃式排序;
- ✅ 插入排序让你体会"逐步理牌"的直觉;
- ✅ 选择排序让你看清"每轮挑最小"的朴素逻辑。
如果你想连其他算法一起看,项目里还提供了冒泡排序、归并排序、快速排序的脚本,分布在sort_circle、sort_color、sort_scale等目录中,甚至还有把多个二维数组拼成立方体的sort_combined/combined_sort_cube.py。打开 Blender,运行一个脚本,花 30 秒看完一段动画,你对排序算法的理解会立刻上一个台阶。🚀
【免费下载链接】Sorting-Algorithms-BlenderSorting algorithms visualized using the Blender Python API.项目地址: https://gitcode.com/gh_mirrors/so/Sorting-Algorithms-Blender
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考