冒泡排序可视化通过Python的matplotlib库实现,利用FuncAnimation动态展示排序过程。首先生成随机数据并创建柱状图,通过bubble_sort_step函数逐步执行排序,每次比较后用yield返回当前状态,update_plot函数更新图形界面,高亮正在比较的元素,实时显示迭代次数。将bubble_sort_step替换为其他排序算法的生成函数(如插入排序),即可扩展支持更多算法。关键点包括使用yield分步返回、FuncAnimation控制动画帧、颜色标识比较对象、interval调节动画速度,从而直观呈现算法执行流程。

排序算法可视化能帮助理解不同算法的工作过程。用 Python 结合 matplotlib 和 FuncAnimation 可以轻松实现动态展示。下面是一个完整的冒泡排序可视化示例,你也可以扩展到其他算法。
1. 安装依赖库
确保已安装 matplotlib:
pip install matplotlib
2. 冒泡排序可视化代码
以下代码生成随机数组并动态展示冒泡排序过程:
立即学习“Python免费学习笔记(深入)”;
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import random
<h1>生成随机数据</h1><p>data = [random.randint(1, 100) for _ in range(25)]
n = len(data)</p><h1>设置图形</h1><p>fig, ax = plt.subplots()
ax.set_title("Bubble Sort Visualization")
bar_rects = ax.bar(range(len(data)), data, align="edge")
ax.set_xlim(0, n)
ax.set_ylim(0, int(1.1 * max(data)))</p><h1>每次比较后更新的计数器</h1><p>iteration = [0]
text = ax.text(0.02, 0.95, "", transform=ax.transAxes)</p><p>def bubble_sort_step():</p>
<div class="aritcle_card">
<a class="aritcle_card_img" href="https://www.php.cn/ai/%E7%AE%97%E5%AE%B6%E4%BA%91">
<img src="https://img.php.cn/upload/ai_manual/000/000/000/175679969239968.png" alt="算家云">
</a>
<div class="aritcle_card_info">
<a href="https://www.php.cn/ai/%E7%AE%97%E5%AE%B6%E4%BA%91">算家云</a>
<p>高效、便捷的人工智能算力服务平台</p>
<div class="">
<img src="https://www.php.cn/static/images/card_xiazai.png" alt="算家云">
<span>37</span>
</div>
</div>
<a href="https://www.php.cn/ai/%E7%AE%97%E5%AE%B6%E4%BA%91" class="aritcle_card_btn">
<span>查看详情</span>
<img src="https://www.php.cn/static/images/cardxiayige-3.png" alt="算家云">
</a>
</div>
<h1>生成每一步的状态</h1><pre class="brush:php;toolbar:false;"><pre class="brush:php;toolbar:false;">for i in range(n):
for j in range(n - i - 1):
if data[j] > data[j + 1]:
data[j], data[j + 1] = data[j + 1], data[j]
yield data.copy(), j, j + 1 # 返回当前状态和比较位置
yield data, -1, -1 # 排序完成
def update_plot(frame_data):
iteration[0] += 1
current_data, i, j = frame_data
for rect, val in zip(bar_rects, current_data):
rect.set_height(val)
text.set_text(f”Iterations: {iteration[0]}”)
# 高亮正在比较的柱子
for k, rect in enumerate(bar_rects):
if k == i or k == j:
rect.set_color('red')
else:
rect.set_color('skyblue')
return bar_rects
开始动画
anim = FuncAnimation(fig, func=update_plot, frames=bubble_sort_step,
repeat=False, interval=50, cache_frame_data=False)
plt.show()
3. 扩展到其他排序算法
只需替换生成步骤的函数即可。例如插入排序:
def insertion_sort_step(): for i in range(1, n): key = data[i] j = i - 1 while j >= 0 and data[j] > key: data[j + 1] = data[j] j -= 1 yield data.copy(), j, j + 1 data[j + 1] = key yield data.copy(), -1, -1
将 bubble_sort_step() 替换为 insertion_sort_step() 即可看到插入排序动画。
4. 关键点说明
- yield:每次交换后返回当前状态,供动画逐帧绘制
- FuncAnimation:自动调用 update_plot 更新图形
- 颜色高亮:红色表示正在比较的元素,增强可读性
- interval:控制动画速度(毫秒)
基本上就这些,不复杂但容易忽略细节。
大家都在看:
Java调用Python脚本:解决9009错误及最佳实践
Java调用Python脚本:深入解析9009错误码及解决方案
Java调用Python脚本:深入解析9009错误及跨语言交互实践
解决Java调用Python脚本时返回9009错误码的问题
































暂无评论内容