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()),并根据每一帧的数据更新图形。

相关文章
|
4天前
|
Java API 开发工具
如何将python应用编译到android运行
【6月更文挑战第27天】本文介绍在Ubuntu 20上搭建Android开发环境,包括安装JRE/JDK,设置环境变量,添加i386架构,安装依赖和编译工具。并通过`p4a`命令行工具进行apk构建和清理。
22 6
如何将python应用编译到android运行
|
2天前
|
测试技术 Go Python
在python中测试应用
【6月更文挑战第29天】本文介绍Python的unittest是内置的单元测试框架,适合线性控制流的代码测试。并举实例说明,如何组织测试代码,如何构造脚手架和测试套件。
17 6
在python中测试应用
|
1天前
|
数据采集 算法 数据处理
Python并发编程:异步IO与多线程的比较与应用
本文探讨了Python中异步IO和多线程两种并发编程模型的优劣及其在实际应用中的适用性。通过比较它们在性能、资源消耗和代码复杂度等方面的差异,分析了不同场景下选择合适的并发模型的策略和方法。
|
2天前
|
数据采集 JSON 数据可视化
【Python实战】Python对中国500强排行榜数据进行可视化分析
【Python实战】Python对中国500强排行榜数据进行可视化分析
|
23小时前
|
运维 Serverless Shell
Serverless 应用引擎产品使用合集之如何完成Python依赖环境配置
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
2天前
|
数据采集 XML 存储
【Python实战】Python多线程批量采集图片
【Python实战】Python多线程批量采集图片
|
2天前
|
数据采集 XML 存储
【Python实战】Python采集二手车数据——超详细讲解
【Python实战】Python采集二手车数据——超详细讲解
|
2天前
|
消息中间件 缓存 中间件
【赠书活动 - 第1期】- 测试工程师Python开发实战(异步图书出品)| 文末送书
【赠书活动 - 第1期】- 测试工程师Python开发实战(异步图书出品)| 文末送书
|
Python
PYTHON实战两数之和
1. 两数之和 难度:简单 收藏 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。
163 0
PYTHON实战两数之和
|
8天前
|
机器学习/深度学习 人工智能 前端开发
Python中的模块化编程
【6月更文挑战第17天】Python模块化编程与软件架构设计的关键在于拆分任务到独立模块,提高代码的可维护性、可重用性和可扩展性。例如,学生管理系统可分解为录入、查询和删除模块。MVC和MVVM架构模式有助于组织代码,而微服务和函数式编程将在未来发展中扮演重要角色。通过示例代码,读者能学习如何实现这些概念,提升项目开发效率和质量。
155 57