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的coding能力?如何用Python和数据分析鉴别网络刷单 ?使用Python伪装黑客,批量获取网站密码!用Python打造实时截图识别OCR

END

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

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

  1. Canvas制作排序算法演示动画

    tips: 形象化演示排序算法可以让初学者快速理解,比较好的例子:jun-lu的SortAnimate,旧金山大学的David Galles教授的算法演示课件.最近在看canvas,试着用js+can ...

  2. python制作酷炫动画_厉害了!Python+matplotlib制作8个排序算法的动画

    1 算法的魅力 深刻研究排序算法是入门算法较为好的一种方法,现在还记得4年前手动实现常见8种排序算法,通过随机生成一些数据,逐个校验代码实现的排序过程是否与预期的一致,越做越有劲,越有劲越想去研究,公 ...

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

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

  4. Photoshop动画教程:制作枫叶凋落的动画

    Photoshop动画教程:制作枫叶凋落的动画 作者:未知  日期:2007-10-17 10:51:37  来源:论坛整理  点击: <script src="/Click.asp? ...

  5. (四)十大经典排序算法(动画图解,代码完全)

    排序算法是<数据结构与算法>中最基本的算法之一 1. 冒泡排序 1.1 算法步骤 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的 ...

  6. 计算机动画制作简单动画视频教程,如何制作一个时钟转动动画视频?电脑制作动画的软件制作时钟转动的小视频的方法...

    今天小编要来介绍的是制作动画的软件,可以用于制作时钟转动的动画效果,之前小编就介绍过时钟动画制作的方法,但今天的方法更先进哦,这里的时钟的样式还有颜色都可以自定义的哦.制作动画的软件是什么?不是手机自 ...

  7. wincc做皮带动画_WINCC中制作管道流体流动动画的一种方法

    WINCC 中制作管道流体流动动画的一种方法 采用自定义对象的方法制作,不需要使用全局变量及外部量. 以制作横向向右流动流动块为例: 1 .画两个高度相等的矩形,分为是 rec1 和 rec2 , r ...

  8. android 倒水动画,MAYA粒子制作逼真的倒水动画效果

    这篇教程教脚本之家的MAYA FANS们用MAYA粒子制作倒水动画,教程属于基础的MAYA粒子模块教程.难度一般.转发过来和脚本之家的朋友们一起分享.希望脚本之家的朋友们喜欢这篇教程.先来看看最终的效 ...

  9. python实现排序算法_python实现各种排序算法

    冒泡排序 """ 分析 1. 算法是一种与语言无关的东西,更确切地说就算解决问题的思路,就是一个通用的思想的问题 2. 冒泡算法作为最简单的一种排序算法,我们的关注点不应 ...

最新文章

  1. web服务器错误配置文件,web服务器http配置文件
  2. python【蓝桥杯vip练习题库】ADV-147学霸的迷宫(广搜 bfs经典问题)
  3. K-means Algorithm 聚类算法
  4. 【原创】多dpi适配的新姿势
  5. web api json_有关使用JSON Web令牌保护无服务器API的速成班
  6. energy in transition课文翻译_备战四六 | 四六级翻译常考固定表达,速记!
  7. Class com.fasterxml.jackson.databind.ser.BasicSerializerFactory can not access a member of class com
  8. Jar包顺序引起编译错误一例
  9. 【离散数学】集合论 第四章 函数与集合(2) 特殊函数类(单射、满射、双射及其性质、常/恒等函数、置换/排列)
  10. python自制懒人听书
  11. Oracle数据库的【安装包选择、下载】、安装与卸载
  12. McAfee (麦咖啡) 360安全卫士 金山毒霸2008正式免费升级版 超级巡警 IceSword(冰刃)
  13. Mac环境配置及开发遇到的问题记录
  14. C#爬取数据_详细篇
  15. 免费开放可转盲文字库 阿里健康大药房呼吁关注视障群体用药安全
  16. 大学计算机专业那些课 --左飞
  17. 宝塔下 nginx 支持图片放缩
  18. 入门互联网IT行业就业前景如何?
  19. 利用background-position 制作图片爆炸的效果
  20. MSSQL数据库的字段类型总结

热门文章

  1. vue-cli使用swiper4在ie以及safari报错
  2. 企业级应用与互联网应用的区别
  3. ArrayAndString(数组和字符串)
  4. 卷积神经网络(CNN)与特殊的卷积
  5. SpringMVC搭建+实例
  6. 程序员需要谨记的九大安全编码规则
  7. java 获取随机数字的三种方法
  8. display:none;与visibility:hidden;的区别
  9. [转]Ubuntu远程桌面登陆
  10. sparkstreaming监听hdfs目录_大数据系列之Spark Streaming接入Kafka数据