anaconda matplotlib 输出动画_Python+Matplotlib 制作排序算法的动画

1 、算法的魅力

深刻研究排序算法是入门算法较为好的一种方法,现在还记得4年前手动实现常见8种排序算法,通过随机生成一些数据,逐个校验代码实现的排序过程是否与预期的一致,越做越有劲,越有劲越想去研究,公交车上,吃饭的路上。。。那些画面,现在依然记忆犹新。

能力有限,当时并没有生成排序过程的动画,所以这些年想着抽时间一定把排序的过程都制作成动画,然后分享出来,让更多的小伙伴看到,通过排序算法的动态演示动画,找到学习算法的真正乐趣,从而迈向一个新的认知领域。

当时我还是用C++写的,时过境迁,Python迅速崛起,得益于Python的简洁,接口易用,最近终于有人在github中开源了使用Python动画展示排序算法的项目,真是倍感幸运。

动画还是用matplotlib做出来的,这就更完美了,一边学完美的算法,一边还能提升Python熟练度,一边还能学到使用matplotlib制作动画。

2 、完美的答案

这个库一共演示8个常见的排序算法:

  • bubble-sort : Only show the visualization of bubble sorting algorithm in the animation. The following arguments have similar functions.
  • comb-sort
  • heap-sort
  • insertion-sort
  • merge-sort
  • quick-sort
  • selection-sort
  • shell-sort

启动的脚本是output.py,脚本的参数有三类,下面逐个解释。

python output.py play heap-sort reversed

play表示展示排序的动画,其他两个选项:保存htmlmp4

  • play : Play an animation of a specific sorting algorithm or all algorithms in a new window, as a "figure" to Matplotlib.
  • save-html : Save the animation as a HTML page with a sequence of images.
  • save-mp4 : Save the animation as a MP4 video.

heap-sort表示堆排序,就是此次执行脚本你想看哪个排序算法的动画展示,设置为quick-sort表示查看快排动画, all表示所有排序算法一次展示。

reversed 这类参数是我重点想说的,这类参数还有如下其他几个选项。通常说一个快排平均时间复杂度为nlog2n,为什么是平均呢?

我们很难找到一个真正100%准确的函数t,输入data,通过t(data)计算出准确的理论执行时间,因为data的分布无法准确的拟合出来,而它又直接影响到实际的排序时间,比如输入一个几乎排序好的序列,一个没有重复元素的序列,一个随机序列,一个递减序列。所以只能根据某类分布给出大概的预估执行时间值。

  • almost-sorted : Sort an almost-sorted sequence.
  • few-unique : Sort a few-unique sequence.
  • random (default) : Sort a random sequence.
  • reversed : Sort a descending sequence.

3 、动画展示

使用的模块和实例代码如下:

使用的包,主要是内置模块randomossysre,以及 matplotlib的 animation功能,剩下的就是手动实现的8个排序算法。

import random
import os
import sys
import re
from matplotlib import pyplot as plt
from matplotlib import animation
from sorting.data import Data
from sorting.selectionsort import selection_sort
from sorting.bubblesort import bubble_sort
from sorting.insertionsort import insertion_sort
from sorting.shellsort import shell_sort
from sorting.mergesort import merge_sort
from sorting.quicksort import quick_sort
from sorting.heapsort import heap_sort
from sorting.combsort import comb_sort
from sorting.monkeysort import monkey_sort

快速排序代码,会保存所有的操作帧:

# Script Name     : quicksort.py
# Author : Howard Zhang
# Created : 14th June 2018
# Last Modified : 14th June 2018
# Version : 1.0
# Modifications :
# Description : Quick sorting algorithm.

import copy
from .data import Data

def quick_sort(data_set):
# FRAME OPERATION BEGIN
frames = [data_set]
# FRAME OPERATION END
ds = copy.deepcopy(data_set)
qsort(ds, 0, Data.data_count, frames)
# FRAME OPERATION BEGIN
frames.append(ds)
return frames
# FRAME OPERATION END

def qsort(ds, head, tail, frames):
if tail - head > 1:
# FRAME OPERATION BEGIN
ds_y = copy.deepcopy(ds)
for i in range(head, tail):
ds_y[i].set_color('y')
# FRAME OPERATION END
i = head
j = tail - 1
pivot = ds[j].value
while i < j:
# FRAME OPERATION BEGIN
frames.append(copy.deepcopy(ds_y))
frames[-1][i if ds[i].value == pivot else j].set_color('r')
frames[-1][j if ds[i].value == pivot else i].set_color('k')
# FRAME OPERATION END
if ds[i].value > pivot or ds[j].value < pivot:
ds[i], ds[j] = ds[j], ds[i]
# FRAME OPERATION BEGIN
ds_y[i], ds_y[j] = ds_y[j], ds_y[i]
frames.append(copy.deepcopy(ds_y))
frames[-1][i if ds[i].value == pivot else j].set_color('r')
frames[-1][j if ds[i].value == pivot else i].set_color('k')
# FRAME OPERATION END
if ds[i].value == pivot:
j -= 1
else:
i += 1
qsort(ds, head, i, frames)
qsort(ds, i+1, tail, frames)


我已经执行完8个排序算法,录制了3个动画,效果如下:

1) 快速排序

2112eff9f581751a1601dedb828ee276.png

2) 归并排序

e69b603e077b4016901c36212b18db86.png

3) 堆排序

f683d10ce7761472ac1c73892b689803.png

项目地址,这里面有完整源码:

https://github.com/zamhown/sorting-visualizer

往期精彩
如何在面试中展现你对Python的coding能力?如何用Python和数据分析鉴别网络刷单 ?使用Python伪装黑客,批量获取网站密码!用Python打造实时截图识别OCR

END

关注【程序IT圈】,更多的Python好文输出

600fcebc4b897a24ccfed37233f51f9d.png

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

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

相关文章

如何在centos中找到安装mysql_centos上如何安装mysql

centos可以使用yum安装mysql 但是版本很低&#xff0c;且不灵活。本文将介绍如何使用安装包安装mysql将下载文件放在/opt/mysoft文件夹中解压文件tar -xf MySQL-5.6.22-1.linux_glibc2.5.x86_64.rpm-bundle.tar这里我们要安装mysql的服务端和客服端&#xff0c;所以使用下面两个…

html选择器_css的9个常用选择器

1.类选择器&#xff08;通过类名进行选择&#xff09;<!DOCTYPE html> <html> <head><title></title> </head> <style type"text/css">.p1{color: #00ff00;}.p2{color: #0000ff;} </style> <body><p class…

Resharper4.5:增强你的.net开发

Resharper4.5:增强你的.net开发 介绍 无庸置疑&#xff0c;ReSharper是最智能化的微软Visual Studio插件。它包括一系列丰富的能大大增加C#和Visual Basic.net开发者生产力的特征。使用ReSharper&#xff0c;你可以进行深度代码分析&#xff0c;智能代码协助&#xff0c;实时错…

mybatis collection_MyBatis之关联查询

前言我们进行数据库查询时往往需要的不止一张表的数据&#xff0c;需要将多张表的数据一起查询出来&#xff0c;大家学习过数据库的连接查询&#xff0c;那么在MyBatis中如何将有关系的多张表数据进行关联查询呢。表的结构商品和订单是典型的一对多关系&#xff0c;下面的案例我…

mysql如何优化性能优化_如何优化性能?MySQL实现批量插入以优化性能的实例详解...

这篇文章主要介绍了MySQL实现批量插入以优化性能的教程,文中给出了运行时间来表示性能优化后的对比,需要的朋友可以参考下对于一些数据量较大的系统&#xff0c;数据库面临的问题除了查询效率低下&#xff0c;还有就是数据入库时间长。特别像报表系统&#xff0c;每天花费在数据…

不支持对系统目录进行即席更新_「目录」让你的文档结构一目了然

很多时候&#xff0c;要求文档要有目录&#xff0c;比如书籍/杂志/论文/标书等等。目录可以让文档结构一目了然。如果不了解 Word &#xff08;包括 Microsoft Office 和 WPS Office 下的Word&#xff09;操作&#xff0c;目录的各标题及对应页码可能是手动一个一个码上去。其实…

合成/聚合原则: 桥接模式

假想场景&#xff1a;hp和apple是全球知名的电脑生产厂家&#xff0c;起初他们各自的电脑操作系统分别是linux和macintosh&#xff0c;microsoft是软件行业的龙头。为了吸引更多客户购买电脑&#xff0c;hp和apple请ms为他们开发两款最常用的软件&#xff0c;办公软件和及时通讯…

java查看jdk源码_Java-如何查看JDK源码

一、引言学习Java和使用Java的小伙伴都必须要看的懂Java的开发文档&#xff0c;然而&#xff0c;开发文档只是开发者对Java代码的功能做出简略的说明&#xff0c;它只是告诉你这个类能干嘛&#xff0c;并没告诉你这个类怎么干&#xff0c;所以&#xff0c;阅读Java源码是每个开…

arrays中copyof复制两个数组_数据结构与算法(3)数组

前言数组(Array)是一种线性表数据结构&#xff0c;利用一组连续的内存空间&#xff0c;存储一组具有相同类型的数据。概念介绍首先我们说一下什么是线性表&#xff0c;线性表就是数据排成一条线的数据结构&#xff0c;每个线性表最多只有前和后两个方向&#xff0c;数组、链表、…

java做的一个将中文转换成Unicode码的工具类【转载】做个标记,明天研究下

这两天在使用RBManager&#xff08;一个开源工具&#xff0c;用于多国化字符转化&#xff09;工具的时候觉得很不方便&#xff0c;有的时候只需要知道中文对应的unicode码是多少&#xff0c;不需要这么麻烦的操作&#xff0c;所以就自己写了一个工具&#xff0c;专门用于将中文…

unity game和scene效果不一样_KTV装修设计:如何让消费者体验到不一样的KTV娱乐效果...

现代KTV装修设计要尽显奢华与高贵,但起到吸引消费者的却是浓烈的欢快氛围和愉悦的歌唱体验.KTV想要有一个好的装修效果,需要了解各方面的细节问题.下面怡元小编讲述如何设计能让消费者体验到不一样的KTV娱乐效果?1、氛围设计在KTV装修设计中,氛围设计非常考究,尤其是消费者进入…

feather 设置坐标刻度_Matlab中将坐标轴放在原点位置

转载一篇文章&#xff0c;原文链接&#xff1a;https://blog.csdn.net/xiaobiyin9140/article/details/84519419​blog.csdn.net需求使用matlab画图&#xff1a;设置y轴位置&#xff0c;使y轴在x轴的中间示例画一个sigmoid函数MATLAB代码x-10:0.1:10; ysigmf(x,[1 0]); plot(…

hana数据库导入mysql_【SAP HANA】新建表以及操作数据(3)

账号和数据库都创建好之后&#xff0c;接下来就可以创建表了。来见识一下这个所谓“列式”存储方式的表是长啥样的&#xff01;一、可视化新建表然后输入所需栏位&#xff0c;设置好类型和长度&#xff1a;上图右上角可以看到类型是Column Store&#xff0c;代表列式存储&#…

(转)Asp.net 中 Get和Post 的用法

单form的提交有两种方式&#xff0c;一种是get的方法&#xff0c;一种是post 的方法.看下面代码,理解两种提交的区别: <form id"form1" method"get" runat"server"> <div> 你的名字<asp:TextBox ID"name" ru…

matlab lu分解求线性方程组_计算方法(二)直接三角分解法解线性方程组

封面是WH2里春希在编辑部的上司麻理前辈&#xff0c;有一说一&#xff0c;这条线的第一次H有点恶趣味&#xff0c;不是很喜欢。一&#xff1a;概述矩阵分解我学过的挺多种&#xff0c;比如极分解&#xff0c;谱分解&#xff0c;满秩分解&#xff0c;正交三角分解还有这里的直接…

html弹出保存文件对话框_有没有遇到过CAD文件损坏或打不开的情况?养成这个习惯很重要...

经常使用CAD制图&#xff0c;难免会遇到CAD文件损坏或者打不开的情况&#xff0c;遇到这种情况&#xff0c;我们会想尽办法来恢复文件&#xff0c;而最有效的办法之一就是从备份文件中恢复我们的图形&#xff0c;因此在制图过程中&#xff0c;我们应养成备份的好习惯&#xff0…

linux java uml_简单实用UML关系图解

一句话UML&#xff0c;再记不住就要DPP了&#xff1a;关系图解代码备注1&#xff1a;继承关系(Generalization)2&#xff1a;实现关系(Realization)3&#xff1a;依赖关系(Dependency)方法的参数、局部变量、返回值4&#xff1a;关联关系(Association)互为类属性5&#xff1a;方…

linux scrapy 定时任务_Linux定时任务给心爱的小姐姐发情书

计划任务基本概述什么是crond?crond就是计划任务&#xff0c;类似于我们平时生活中的闹钟&#xff0c;定点执行。为什么要用crond?计划任务主要是做一些周期性的任务&#xff0c;比如: 凌晨3点定时备份数据。或11点开启网站抢购接口&#xff0c;12点关闭抢占接口。计划任务主…

初中文化能学编程吗_网页编程课程来了,确定不来pick一下!!!|科创辅学进行时...

KE CHUANG FU XUE科创辅学天天用手机&#xff0c;各种app 半夜不睡觉&#xff0c;只会网上浪醒醒&#xff0c;少年&#xff0c;别玩了不要再搞这些花里胡哨的东西了&#xff01;要学会用魔法打败魔法上一周&#xff0c;我们跟着夏老师学习了Arduino单片机编程基础这一周开源软…

ffmpeg检测文件是否损坏_教你一招如何检测硬盘,让你知道硬盘是否有损坏?还有几天寿命?...

8月底的南方小城镇依然非常炎热&#xff0c;临近下班&#xff0c;坐上我的敞篷座机-电动小毛驴&#xff0c;正准备开启兜风模式&#xff0c;美-女同-事小莉叫住了我&#xff0c;说她家里的电脑这几天老是蓝屏&#xff0c;让我去帮她看看。美-女有-约&#xff0c;怎么能忍心拒绝…