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

news2024/12/23 21:23:03

写在前言

hello,大家好,我是一点,专注于Python编程,如果你也对感Python感兴趣,欢迎关注交流。

希望可以持续更新一些有意思的文章,如果觉得还不错,欢迎点赞关注,有啥想说的,可以留言或者私信交流。

如果你想看什么主题的文章,欢迎留言交流,关注公号【一点sir】,领取编程资料。

如果你还不了解Python这门语言,要系统性的学习 Python 这门语言,可以查看我的专栏——《Python教程》

今天更新的文章是《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')

来看下生成的效果:
在这里插入图片描述

代码解释

上面我们最核心的主要部分是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()),并根据每一帧的数据更新图形。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1698315.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决文件夹打开出错问题:原因、数据恢复与预防措施

在我们日常使用电脑或移动设备时,有时会遇到一个非常棘手的问题——文件夹打开出错。这种错误可能会让您无法访问重要的文件和数据,给工作和生活带来极大的不便。本文将带您深入了解文件夹打开出错的原因,并提供有效的数据恢复方案&#xff0…

栈和队列的基本见解

1.栈 1.1栈的基本概念和结构: 栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出的原则。 压栈:栈的插入操作叫做进栈/压栈…

Vxe UI 表单设计器、零代码平台

vxe-pc-ui Vxe UI 表单设计器、零代码表单设计器 安装 Vxe UI PC端组件库 官方文档 查看 github、gitee // ...import VxeUI from vxe-pc-uiimport vxe-pc-ui/lib/style.css// ...// ...createApp(App).use(VxeUI).mount(#app)// ...使用 vxe-form-design 设计器组件 vxe-fo…

QML的Image 路径问题(source)

四种路径格式 在 QML 中,当你使用 Image 元素的 source 属性来指定一个图片的路径时,有几种不同的方式可以指定这个路径,每种方式都有其特定的用途和上下文。 相对路径: QML 文件和一个名为 close.png 的图片在同一目录下&#x…

列表元素添加的艺术:从单一到批量

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言 二、向列表中添加单一元素 1. append方法 2. insert方法 三、向列表中添加批量…

CentOS网络配置(三种网络模式:桥接、NAT、Host-Only)

目录 1、虚拟机网络模式 1.1 桥接 1.2 NAT 1.3 Host-Only 2、桥接模式 3、仅主机模式 4、NAT模式 5、centos网络配置 5、virtualbox 下centos7网络配置 5.1管理 ——> 全局设定 ——> 网络,新加网络 5.2 具体虚拟机设置,网络设置&#…

软件设计师笔记2

文章目录 软考知识点总结1. 计算机组成原理网络与信息安全数据结构与算法AOE网 编译原理操作系统软件设计软件测试数据库计算机软件产权其它 软考知识点总结 1. 计算机组成原理 cpu控制器,专门产生指令操作,送到计算机各个部位执行处理 DMA&#xff08…

python调用阿里云通义千问(q-wen-max)API-只能总结pdf文档内容

文章目录 通义千问插件PDF解析插件调用案例通义千问插件 Dashscope插件功能能够使得大模型的生成内容与外部三方应用结合,使得模型生成的内容更加准确和丰富,模型将拥有更好的生成能力。您也可以通过开发自定义插件,来使得模型生成更符合您预期的结果。 使用插件功能,大模…

第十三节:带你梳理Vue2 : watch侦听器

官方解释:> 观察 Vue 实例变化的一个表达式或计算属性函数。回调函数得到的参数为新值和旧值。表达式只接受监督的键路径。对于更复杂的表达式&#xff0c;用一个函数取代<br/>## 1. 侦听器的基本使用侦听器可以监听data对象属性或者计算属性的变化watch是观察属性的…

细粒度图像分类论文(AAM模型方法)阅读笔记

细粒度图像分类论文阅读笔记 摘要Abstract1. 用于细粒度图像分类的聚合注意力模块1.1 文献摘要1.2 研究背景1.3 本文创新点1.4 计算机视觉中的注意力机制1.5 模型方法1.5.1 聚合注意力模块1.5.2 通道注意力模块通道注意力代码实现 1.5.3 空间注意力模块空间注意力代码实现 1.5.…

VScode解决报错“Remote-SSH XHR failed无法访问远程服务器“的方案

VScode解决报错"Remote-SSH XHR failed无法访问远程服务器"的方案 $ ls ~/.vscode-server/bin 2ccd690cbff1569e4a83d7c43d45101f817401dc稳定版下载链接&#xff1a;https://update.code.visualstudio.com/commit:COMMIT_ID/server-linux-x64/stable 内测版下载链接…

ABAQUS应用07-实现拉伸和压缩刚度不同的弹簧建模

文章目录 0、背景描述1、步骤 0、背景描述 到目前为止&#xff0c;本文的内容我还没有具体实践过&#xff0c;但是个人认为后期是会用到的。比如说&#xff0c;对于风电机组地基转动刚度的设置&#xff0c;土体就是一种拉压刚度并不相同的材料。所以现在先记录下来&#xff0c…

如何利用OpenHarmony ArkUI的Canvas组件实现涂鸦功能?

简介 ArkUI是一套UI开发框架&#xff0c;提供了开发者进行应用UI开发时所需具备的能力。随着OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;不断更新迭代&#xff0c;ArkUI也提供了很多新的组件&#xff0c;例如Canvas、OffscreenCanvas、XComponent组…

Git Large File Storage (LFS) 的安装与使用

Git Large File Storage [LFS] 的安装与使用 1. An open source Git extension for versioning large files2. Installing on Linux using packagecloud3. Getting StartedReferences 1. An open source Git extension for versioning large files https://git-lfs.com/ Git …

手把手从0到1教你做STM32+FreeRTOS智能家居--第10篇之ASR-PRO语音识别模块

前言 先看实验效果&#xff0c;通过ASR-PRO语音智能识别控制模块&#xff0c;来控制STM32单片机实现对应的控制功能。因为后台好多小伙伴私信问用的是什么语音模块&#xff0c;并且很少在网上看到如何使用此模块相关的文章&#xff0c;所以我将会在本篇文章详细介绍一下此模块…

列表和元组

2.1序列概述 列表和元组的主要不同在于&#xff0c;列表是可以修改的&#xff0c;而元组不可以。这意味着列表适用于需 要中途添加元素的情形&#xff0c;而元组适用于出于某种考虑需要禁止修改序列的情形。 Python支持一种数据结构的基本概念&#xff0c;名为容器&#xff0…

Gradle筑基——Gradle Maven仓库管理

基础概念&#xff1a; 1.POM pom:全名Project Object Model 项目对象模型&#xff0c;用来描述当前maven项目发布模块的基础信息 pom主要节点信息如下&#xff1a; 配置描述举例&#xff08;com.android.tools.build:gradle:4.1.1&#xff09;groupId组织 / 公司的名称com.…

clone方法总结Java

Java中Object类当中有许多方法&#xff0c;如图所示&#xff1a; clone方法就是其中一种&#xff0c;分为浅拷贝&#xff0c;深拷贝举一个例子&#xff1a; 浅拷贝&#xff1a; 在Person类当中右键鼠标然后&#xff0c;选中Generate&#xff1a; 然后重写clone方法 protecte…

福昕PDF编辑器自定义快捷方式

你是否为用不惯福昕PDF编辑器自带的快捷键而发愁&#xff1f;今天&#xff0c;我和大家分享一下如何设置自己想要的快捷键方式&#xff0c;希望能对大家有帮助。 步骤一&#xff1a;打开福昕PDF编辑&#xff0c;并找到更多命令 步骤二&#xff1a;切换到键盘一栏&#xff0c;并…

微信小程序基础 --模板语法(4)

模板语法 1、wxml视图结构 1.1 概述 开发文档&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/framework/quickstart/code.html#WXML-%E6%A8%A1%E6%9D%BF 从事过网页编程的人知道&#xff0c;网页编程采用的是 HTML CSS JS 这样的组合&#xff0c;其中 HT…