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 reversedplay表示展示排序的動畫,其他兩個選項:保存html和mp4
- 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 、動畫展示
使用的模塊和實例代碼如下:
使用的包,主要是內置模塊random,?os,?sys,?re,以及?matplotlib的?animation功能,剩下的就是手動實現的8個排序算法。
import randomimport 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打造實時截圖識別OCREND
關注【程序IT圈】,更多的Python好文輸出
總結
以上是生活随笔為你收集整理的anaconda matplotlib 输出动画_Python+Matplotlib 制作排序算法的动画的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不来月经是不孕症吗
- 下一篇: python连接sqlite数据库的代码