厉害了!Python+matplotlib制作8个排序算法的动画
文章來源于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 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 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个排序算法的动画的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Keras vs tf.keras: 在
- 下一篇: 十分钟掌握pyecharts十类顶级图,