9 種經典排序算法的可視化,用Python3分鐘就可以搞定!

不知道作者是怎么做的,但是突然很想自己實現一遍,而且用python實現特別快,花了一天的時間,完成了這個項目。主要包括希爾排序(Shell Sort)、選擇排序(Selection Sort)、快速排序(Quick Sort)、歸并排序(Merge Sort)等九種排序。

附上源碼鏈接:

https://github.com/ZQPei/Sorting_Visualization

(覺得不錯,記得幫忙點個star哦)

下面具體講解以下實現的思路,大概需要解決的問題如下:

  • 如何表示數組
  • 如何得到隨機采樣數組,數組有無重復數據
  • 如何實現排序算法
  • 如何把數組可視化出來

一、如何表示數組

python提供了list類型,很方便可以表示C++中的數組。標準安裝的Python中用列表(list)保存一組值,可以用來當作數組使用,不過由于列表的元素可以是任何對象,因此列表中所保存的是對象的指針。這樣為了保存一個簡單的[1,2,3],需要有3個指針和三個整數對象。對于數值運算來說這種結構顯然比較浪費內存和CPU計算時間,再次就不詳細論述。

二、如何得到隨機采樣數組,數組有無重復數據

假設我希望數組長度是100,而且我希望數組的大小也是在[0,100)內,那么如何得到100個隨機的整數呢?可以用random庫。

示例代碼:

image

但是以上代碼有個問題,random.choices是對一個序列進行重復采樣,得到的數組存在重復數據,那如果不希望存在重復數據,而是希望進行無重復采樣,怎么辦?

可以用random.sample函數,示例代碼:

image

這樣就可以得到無重復采樣數據了。

三、如何實現排序算法

算法種類較多,就不一一舉例;再次就以希爾排序(Shell Sort)為例講講:

爾排序的原理:希爾排序(Shell Sort)是插入排序的一種。也稱縮小增量排序,是直接插入排序算法的一種更高效的改進版本。

希爾排序是把記錄按下標的一定增量分組,對每組使用直接插入排序算法排序;隨著增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至1時,整個文件恰被分成一組,算法便終止。

基礎的插入法排序是兩重循環,希爾排序是三重循環,最外面一重循環,控制增量gap,并逐步減少gap的值。二重循環從下標為gap的元素開始比較,依次逐個跨組處理。最后一重循環是對組內的元素進行插入法排序。這樣進行排序的優點在于每次循環,整個序列的元素都將小元素的值逐步向前移動,數值比較大的值向后移動。

示例代碼:

image

四、如何把數組可視化出來

有了隨機數組初始化方法,再實現好排序函數,我們還差一步,就是把排序函數中每次移動數組后將數組可視化并輸出。

對數組進行可視化,很容易想到python的可視化工具matplotlib!但是在項目中我并沒有用matplotlib,而是用了numpy+opencv。

為什么不用matplotlib?

因為在排序過程中,每次修改數組,都希望能夠實時修改圖片并輸出,matplotlib確實很方便,但是matplotlib的效率實在是不高,而且每次修改數組前后的兩幅圖片其實是差不多的。如果用matplotlib,每次都是要重新繪制圖片,非常耗時?。。?/p>

所以考慮自己生成圖片,在每次修改數組后,只將圖片中改動的那兩列進行修改即可!這樣就比用matplotlib每次重新繪制圖片效率高得多!

數組中主要有兩種操作,一種是對某個idx賦值,一種是交換某兩個idx的值。

示例代碼:

image

詳細代碼見github:

https://github.com/ZQPei/Sorting_Visualization

(就等你的小小star)其他的都沒有什么了,有細節的問題可以在我的github下面留言勾搭。

最后附上一張效果圖:

image
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容