文章来源于Python与算法社区,作者zglg

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 Datadef quick_sort(data_set):# FRAME OPERATION BEGINframes = [data_set]# FRAME OPERATION ENDds = copy.deepcopy(data_set)qsort(ds, 0, Data.data_count, frames)# FRAME OPERATION BEGINframes.append(ds)return frames# FRAME OPERATION ENDdef qsort(ds, head, tail, frames):if tail - head > 1:# FRAME OPERATION BEGINds_y = copy.deepcopy(ds)for i in range(head, tail):ds_y[i].set_color('y')# FRAME OPERATION ENDi = headj = tail - 1pivot = ds[j].valuewhile i < j:# FRAME OPERATION BEGINframes.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 BEGINds_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 += 1qsort(ds, head, i, frames)qsort(ds, i+1, tail, frames)

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

1) 快速排序

2) 归并排序

3) 堆排序

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

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

备注:公众号菜单包含了整理了一本AI小抄非常适合在通勤路上用学习

往期精彩回顾那些年做的学术公益-你不是一个人在战斗适合初学者入门人工智能的路线及资料下载机器学习在线手册深度学习在线手册AI基础下载(第一部分)备注:加入本站微信群或者qq群,请回复“加群”加入知识星球(4500+用户,ID:92416895),请回复“知识星球”

喜欢文章,点个在看

厉害了!Python+matplotlib制作8个排序算法的动画相关推荐

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

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

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

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

  3. Python+Matplotlib制作动画

    转载自:https://www.cnblogs.com/endlesscoding/p/10308111.html 看到一篇觉得非常不错的Python+Matplotlib制作动画的方法

  4. 【Python】用Python实现十大经典排序算法

    来源:Python数据之道 (ID:PyDataLab) 作者:阳哥 大家好,我是阳哥. 最近一段时间,我在微信视频号「Python数据之道」上陆陆续续发布了10种经典排序算法的动画实现. 今天,想以 ...

  5. python高阶函数——sorted排序算法

    python高阶函数--sorted排序算法 python 内置的sorted()函数可以对一个list进行排序: >>> sorted([8,3,8,11,-2]) [-2, 3, ...

  6. Python:实现gnome sortt侏儒排序算法(附完整源码)

    Python:实现gnome sortt侏儒排序算法 def gnome_sort(lst: list) -> list:if len(lst) <= 1:return lsti = 1w ...

  7. Python:实现natural sort自然排序算法(附完整源码)

    Python:实现natural sort自然排序算法 from __future__ import annotationsimport re msd radix sortdef natural_so ...

  8. Python:实现comb sort梳状排序算法(附完整源码)

    Python:实现comb sort梳状排序算法 def comb_sort(data: list) -> list:shrink_factor = 1.3gap = len(data)comp ...

  9. 用Python实现十大经典排序算法

    来源:Python数据之道 (ID:PyDataLab) 作者:阳哥 大家好,我是阳哥. 最近一段时间,我在微信视频号「Python数据之道」上陆陆续续发布了10种经典排序算法的动画实现. 今天,想以 ...

最新文章

  1. python 的文件读写方法:read readline readlines wirte   writelines
  2. 给力2011-东莞市南洋计算机软件有限公司 携手10大厂商提供企业安全有效节省成本解决方案...
  3. 一步一步使用Ext JS MVC与Asp.Net MVC 3开发简单的CMS后台管理系统之登录窗口调试...
  4. 【计算机网络】深入浅出网络层(看不懂你来打我.上)
  5. linux环境下查看项目内存情况
  6. 2015年IT领域里Docker和其它颠覆性的趋势
  7. Hive 终于等来了 Flink
  8. day11--Matplotlib--柱形图与盒图
  9. 原版windows下载地址
  10. C#使用SHA1加密类(RSAFromPkcs8)支持1024位和2048位私钥
  11. 国家虚拟仿真实验教学项目共享平台(实验空间)PHP SDK
  12. 树莓派显示中文和添加中文输入法
  13. 错误解决:ThinkPHP 3.1 { Fast Simple OOP PHP Framework } -- [ WE CAN DO IT JUST THINK ]
  14. Python(十三)IO编程
  15. 树莓派3+安装centos
  16. 融入城市路网的乡村道路问题及对策
  17. 2023最新猕猴桃影视系统源码/影视APP源码+安卓/苹果双端
  18. 《深入理解计算机系统》漫游指南
  19. symbian流媒体入门之--《3gp文件格式研究》
  20. 关于微信开放平台开发者资质认证的简单记录

热门文章

  1. 【java】java开发中的23种设计模式详解
  2. 创建一个catkin工作空间
  3. bestcoder Delete
  4. jquery Deferred
  5. MyBatis(二)——多对一、一对多
  6. stm32 定时器_如何计算STM32定时器、独立看门狗和窗口看门狗
  7. 用python计算准确率_Python中计算模型精度的几种方法,Pytorch,中求,准确率
  8. Java实现二分查找及其优化
  9. printf不能直接输出string类型
  10. 人工智能 | 增强小目标检测(Augmentation for small object detection)