Python+Matplotlib 制作排序算法的动画

2023-05-16

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) 快速排序

2) 归并排序

3) 堆排序

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

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

往期精彩

如何在面试中展现你对Python的coding能力?

如何用Python和数据分析鉴别网络刷单 ?

使用Python伪装黑客,批量获取网站密码!

用Python打造实时截图识别OCR

END

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python+Matplotlib 制作排序算法的动画 的相关文章

  • git bash窗口两种方法快速粘贴

    第一种方法 xff1a 右键 gt 点击 Paste 即可粘贴已复制的内容 第二种方法 xff1a 点击鼠标中间的滚轮
  • 提示:The word is not correctly spelled 解决方法

    分析 xff1a The word is not correctly spelled 该问题由Eclipse的单词拼写校验造成 xff0c 一般出在配置文件中 xff0c 会影响程序正常执行 解决 xff1a 在Eclipse下依次点击Wi
  • 正确使用和保存deconfig的流程:

    正确使用和保存deconfig的流程 xff1a 1 要修改在arch arm configs下的文件xxx defconfig 2 make ARCH 61 arm64 xxx defconfig 会生成 config文件 3 make
  • Ubuntu安装Brave浏览器

    sudo curl x 34 http 127 0 0 1 8889 34 fsSLo usr share keyrings brave browser archive keyring gpg https brave browser apt
  • Android O HIDL框架

    HIDL简介 Android O开始 xff0c Google为了将framework和HAL层分割开来 xff0c 使得framework可以独立于HAL层更新 xff0c 设计了HIDL 有了HIDL xff0c HAL模块可以以一个独
  • Xfce 安装主题

    一 主题种类 xff08 一 xff09 gtk主题 窗口内的按钮和文本 xff0c 要在 外观 中的 样式 标签页设置 1 主题文件位置 xff1a 用户目录下 local share themes或者 themes xff0c 系统目录
  • Linux更改键位映射

    linux使用xmodmap管理键位映射 一 xmodmap xff08 一 xff09 语法格式 xmodmap 选项 filename xff08 二 xff09 选项 display host dpy X server to use
  • MySQL 建表 技巧

    1 create time 自动填写创建日期 xff0c update time 数据更新之后自动更新时间 使用DDL语句创建 CREATE TABLE 96 production info 96 96 id 96 int NOT NULL
  • Android 连接MySQL 并打包

    1 代码配置 2 打包选项配置 xff0c 一定是mono 43 net 4 x
  • HybridCLR 实战篇

    HybridCLR 实战篇 HybridCLR 是MIT开源的一个unity热更新打包方案 xff0c 该插件不像LUA和ILRuntime那样复杂 官方文档 xff1a https focus creative games github
  • Intellij IDEA中的撤销和回复撤销快捷键

    Intellij IDEA中 1 Ctrl 43 z是撤销快捷键 2 如果想恢复Ctrl 43 z 掉的内容 xff0c 按快捷键为 xff1a Ctrl 43 Shift 43 Z
  • linux zip文件解压命令详解

    文章转自 xff1a http www cnblogs com wangkongming p 4305962 html 1 把 home目录下面的mydata目录压缩为mydata zip zip r mydata zip mydata 压
  • mouse without borders win7安装不了

    mouse without borders 在win7安装的时候提示 Your computer span class hljs keyword has span span class hljs keyword not span been
  • 如何将git branch 和 commit id打印到内核log中?

    问题提出 xff1a 多项目多分支的开发模式中 xff0c 为了方便定位问题 xff0c 往往需要确认当前的问题日志对应的是哪个分支 xff0c 哪个提交 为了解决这个问题我们需要有一种方便的手段 解决方案 xff1a 首先想象的是是把gi
  • linux按进程名杀进程

    pkill 进程名 或是 killall 进程名 1 kill 9 ps ef grep 进程名关键字 gawk 0 grep print 2 tr s n 39 这个是利用管道和替换将 进程名对应的进程号提出来作为kill的参数 很显然上
  • IntelliJ IDEA中工具栏,功能区的显示和关闭

    点击 view xff0c 点击toolbar 显示工具栏 xff0c tool buttons 功能区tab 官人打赏 xff1a http blog csdn net assassinsshadow article details 76
  • chrome 删除厌烦的桔梗导航

    最近突然出现了让人非常厌恶的桔梗导航 xff0c 楼主找了写办法 xff0c 解决了这个bug xff08 程序员的骄傲 xff0c 虽然网上可能有人已经搞好了 xff09 我的系统是win10 1 开始菜单中找到chrome并打开文件位置
  • jetbrans rider 格式化代码时,{}不换行

    因为之前是写JAVA的 xff0c 所以对代码的格式优点洁癖 我希望看到的代码格式是这样的 span class hljs keyword private span span class hljs keyword void span spa
  • unity 设置物体不能被穿透

    墙壁box collider Is Trigger不勾选 cube xff0c rigidbody collision detection 设置为continuous dynamic
  • Docker实践笔记6:PHP容器制作

    容器介绍 此容器包含 PHP 7 3 和Nginx1 18环境 xff0c 用户可以自己使用Makefile 一键编译安装PHP环境 xff0c 也可以直接使用制作好的镜像运行项目 容器源码下载 git clone https github

随机推荐