Python应用实战,用动画生成冒泡排序的过程

简介: 冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

用Python实现冒泡排序

现在我们用Python语言来实现一个冒泡排序,这个应该是很简单的,以下是代码,应该很好理解吧。

def bubble_sort(arr):
    n = len(arr)
    # 遍历所有数组元素
    for i in range(n):
        # Last i elements are already in place
        for j in range(0, n-i-1):
            # 遍历数组从0到n-i-1
            # 交换如果元素大于下一个元素
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
    return arr
# 测试冒泡排序函数
arr = [64, 34, 25, 12, 22, 11, 90, 1, 10, 33]
sorted_arr = bubble_sort(arr)
print("Sorted array is:", sorted_arr)

在这个例子中,bubble_sort 函数接受一个列表 arr 作为参数,并在原地进行排序。函数首先获取列表的长度 n,然后使用两个嵌套的循环来遍历列表中的每个元素。外层循环负责遍历整个列表,内层循环则负责比较相邻的元素并在需要时交换它们。

冒泡排序并不是一个高效的排序算法,尤其是对于大型数据集。它的平均时间复杂度和最坏时间复杂度都是 O(n^2),其中 n 是列表中的元素数量。对于实际应用,通常会选择更高效的排序算法,如快速排序、归并排序或堆排序。

用动画实现冒泡排序

要想用动画的方式实现冒泡排序,首先需要选择一个好用的可视化的第三方Python库,这里我们可以使用 matplotlib 库来创建一个简单的可视化效果。

首先,确保你你的环境已经安装了 matplotlib 库。如果还没有安装,可以通过以下命令安装:

pip install matplotlib

下面我们是直接给出实现的代码,后面我们给出详细的解释。

import matplotlib.pyplot as plt
import matplotlib.animation as animation
def bubble_sort(arr):
    n = len(arr)
    for i in range(n):
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
                yield arr.copy()
def update(data):
    # 更新图形,重新绘制数据
    global step_count
    for rect, val in zip(bar_rects, data):
        rect.set_height(val)
    plt.title(f"Step {step_count}")
    step_count += 1
data = [64, 34, 25, 12, 22, 11, 90, 1, 10, 33]
fig, ax = plt.subplots()
bar_rects = ax.bar(range(len(data)), data, align="edge")
# 设置初始步数
step_count = 1
# 创建动画对象
anim = animation.FuncAnimation(
    fig, update, frames=bubble_sort(data.copy()),
    repeat=False, interval=500
)
anim.save('bubble_sort.gif')

来看下生成的效果:

7658a0f5484643efb405e99acc1a2dea_tplv-obj.gif

代码解释

上面我们最核心的主要部分是matplotlib库中的FuncAnimation类,这是用于创建动画的类,它允许用户通过指定更新函数和帧生成器函数来生成动画。以下是这个类的接口的参数。

FuncAnimation(fig, func, frames, init_func=None, fargs=None, repeat=False, repeat_delay=0, blit=False, interval=200)

fig:需要绘制动画的图形对象。
func:更新函数,每次动画更新时调用该函数。
frames:帧生成器函数,用于生成动画的每一帧。
init\_func:初始化函数,用于绘制静态内容。
fargs:更新函数`func`的参数。
repeat:是否重复播放动画。
repeat\_delay:重复播放时的延迟时间。
blit:是否仅绘制变化的部分,可以提高动画绘制效率。
interval:每帧的间隔时间(毫秒)。

在上面的示例代码中,我们使用了FuncAnimation方法来创建动画对象,传入了画布对象fig、更新函数update、排序生成器函数bubble_sort(data.copy())、禁止重复播放(repeat=False)、以及每帧间隔500ms(interval=500)。

FuncAnimation方法在后台会不断调用更新函数update和帧生成器函数bubble_sort(data.copy()),并根据每一帧的数据更新图形。

相关文章
|
27天前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
236 7
|
1月前
|
数据采集 Web App开发 数据安全/隐私保护
实战:Python爬虫如何模拟登录与维持会话状态
实战:Python爬虫如何模拟登录与维持会话状态
|
1月前
|
传感器 运维 前端开发
Python离群值检测实战:使用distfit库实现基于分布拟合的异常检测
本文解析异常(anomaly)与新颖性(novelty)检测的本质差异,结合distfit库演示基于概率密度拟合的单变量无监督异常检测方法,涵盖全局、上下文与集体离群值识别,助力构建高可解释性模型。
287 10
Python离群值检测实战:使用distfit库实现基于分布拟合的异常检测
|
1月前
|
数据采集 监控 数据库
Python异步编程实战:爬虫案例
🌟 蒋星熠Jaxonic,代码为舟的星际旅人。从回调地狱到async/await协程天堂,亲历Python异步编程演进。分享高性能爬虫、数据库异步操作、限流监控等实战经验,助你驾驭并发,在二进制星河中谱写极客诗篇。
Python异步编程实战:爬虫案例
|
1月前
|
Cloud Native 算法 API
Python API接口实战指南:从入门到精通
🌟蒋星熠Jaxonic,技术宇宙的星际旅人。深耕API开发,以Python为舟,探索RESTful、GraphQL等接口奥秘。擅长requests、aiohttp实战,专注性能优化与架构设计,用代码连接万物,谱写极客诗篇。
Python API接口实战指南:从入门到精通
|
1月前
|
存储 分布式计算 测试技术
Python学习之旅:从基础到实战第三章
总体来说,第三章是Python学习路程中的一个重要里程碑,它不仅加深了对基础概念的理解,还引入了更多高级特性,为后续的深入学习和实际应用打下坚实的基础。通过这一章的学习,读者应该能够更好地理解Python编程的核心概念,并准备好应对更复杂的编程挑战。
95 12
|
1月前
|
存储 数据采集 监控
Python文件操作全攻略:从基础到高级实战
本文系统讲解Python文件操作核心技巧,涵盖基础读写、指针控制、异常处理及大文件分块处理等实战场景。结合日志分析、CSV清洗等案例,助你高效掌握文本与二进制文件处理,提升程序健壮性与开发效率。(238字)
243 1
|
1月前
|
存储 Java 调度
Python定时任务实战:APScheduler从入门到精通
APScheduler是Python强大的定时任务框架,通过触发器、执行器、任务存储和调度器四大组件,灵活实现各类周期性任务。支持内存、数据库、Redis等持久化存储,适用于Web集成、数据抓取、邮件发送等场景,解决传统sleep循环的诸多缺陷,助力构建稳定可靠的自动化系统。(238字)
420 1
|
28天前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
203 0
|
1月前
|
机器学习/深度学习 监控 数据挖掘
Python 高效清理 Excel 空白行列:从原理到实战
本文介绍如何使用Python的openpyxl库自动清理Excel中的空白行列。通过代码实现高效识别并删除无数据的行与列,解决文件臃肿、读取错误等问题,提升数据处理效率与准确性,适用于各类批量Excel清理任务。
327 0