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 randomimport osimport sysimport refrom matplotlib import pyplot as pltfrom matplotlib import animationfrom sorting.data import Datafrom sorting.selectionsort import selection_sortfrom sorting.bubblesort import bubble_sortfrom sorting.insertionsort import insertion_sortfrom sorting.shellsort import shell_sortfrom sorting.mergesort import merge_sortfrom sorting.quicksort import quick_sortfrom sorting.heapsort import heap_sortfrom sorting.combsort import comb_sortfrom 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 copyfrom .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].valuewhile 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 ENDif 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 ENDif ds[i].value == pivot:                j -= 1else:                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制作酷炫动画_厉害了!Python+matplotlib制作8个排序算法的动画相关推荐

  1. python绘画酷炫图片_【一点资讯】教程 | 中国酷炫地图,大神教你用Python一边爬一边画 www.yidianzixun.com...

    前言我只说一句,台湾是中华人民共和国不可分割的领土! 先来聊聊为什么做数据分析一定要用Python或R语言.编程语言这么多种,Java, PHP都很成熟,但是为什么在最近热火的数据分析领域,很多人选择 ...

  2. python做动画视频教程_Python+Kepler.gl轻松制作酷炫路径动画的实现示例

    1. 简介 Kepler.gl相信很多人都听说过,作为Uber几年前开源的交互式地理信息可视化工具,kepler.gl依托WebGL强大的图形渲染能力,可以在浏览器端以多种形式轻松展示大规模数据集. ...

  3. Python制作酷炫的动画效果

    1 引言 利用Python的Matplotlib-Animation库可以制作酷炫的数学公式动画,官方教程可访问链接. 本文为了清晰说明如何利用Animation类来实现动画效果,这里采用介绍一个点沿 ...

  4. opencv极坐标转换成直角坐标_媲美 PS,用 Python 制作酷炫极坐标全景图

    点击上方"Python数据之道",选择"星标公众号" 收藏文章的同时,不要忘记「在看」 媲美 PS, 用 Python 制作酷炫极坐标全景图 0 概述  今天要 ...

  5. Python 图像 一样大小_媲美 PS,用 Python 制作酷炫极坐标全景图

    点击上方"Python数据之道",选择"星标公众号" 收藏文章的同时,不要忘记「在看」 媲美 PS, 用 Python 制作酷炫极坐标全景图 0 概述  今天要 ...

  6. 使用Python制作酷炫二维码(myqr)

    使用Python制作酷炫二维码 本篇参考自微信公众号,二三四张图片有改博主知乎的链接哦,https://mp.weixin.qq.com/s/Fq6_KKeN5T28DbfyDsGYDw 平时你见到的 ...

  7. 厉害了!Python+matplotlib制作8个排序算法的动画

    文章来源于Python与算法社区,作者zglg 1 算法的魅力 深刻研究排序算法是入门算法较为好的一种方法,现在还记得4年前手动实现常见8种排序算法,通过随机生成一些数据,逐个校验代码实现的排序过程是 ...

  8. 用python画皇冠_手把手教你用 Python 绘制酷炫的桑基图!

    原标题:手把手教你用 Python 绘制酷炫的桑基图! 作者 | 周志鹏 责编 | 郭 芮 最近,不止一次收到小伙伴的截图追问: "这个图叫什么???" "这个图真好看! ...

  9. python画车辆轨迹图_如何利用 Python 绘制酷炫的 车辆轨迹 — 速度时空图?三维数据用二维图像呈现...

    说明:本文系交通攻城狮原创文章,如需转载请私信联系,侵权必究. 2020,第 30 期,编程笔记 建议直接阅读精编版:如何利用 Python 绘制酷炫的 车辆轨迹 - 速度时空图?三维数据用二维图像呈 ...

最新文章

  1. IT界顶级大咖讲解如何获得月薪5万以上的秘诀干货!
  2. Android与服务器端数据交互(转)
  3. pytorch crelu
  4. 用lemon测交互题
  5. Git 将代码回到指定版本
  6. 许昌:让便捷支付成为智慧城市新名片
  7. 鲶鱼效应:为什么要适当的贷款?
  8. Linux命令大总结(早期学习时的笔记)
  9. C语言试题八十之统计单词个数
  10. C++实现顺序串(完整代码)
  11. Android笔记 使用AIDL和远程服务实现进程通信
  12. 台式电脑蓝牙关了之后就开不了_台式电脑如何通过iPhone上网?
  13. php 图片文件转base64编码格式,php如何将图片转为base64编码格式
  14. Oracle根据外键名称查找关联的表与列
  15. Android开发,并不见得是一个走得长远的路子
  16. 离散数学--命题逻辑(一)
  17. SM4算法 C语言 (从OpenSSL库中分离算法:七)
  18. 04 - 雷达的工作频率
  19. 2ask信号调制与解调 matlab,2ASK2ASK调制与解调系统的MATLAB实现及性能分析
  20. 图像处理之几何变换(python实现)

热门文章

  1. Zend Framework一
  2. 压力测试对于BCH真的有意义吗?
  3. kafka 监控(eagle)
  4. 流程 - 什么是真正的Scrum?
  5. webpack 处理CSS
  6. 火车票上的星号暗藏玄机?!
  7. 设置 HTTP HEADER 字段来提高 Web 安全性
  8. 该怎样才能将PDF转换成HTML
  9. CSS的一些基础知识
  10. UVA 536 TreeRocvery 树重建 (递归)