一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

9種經(jīng)典排序算法的可視化

電子工程師 ? 來源:lq ? 2019-05-19 10:59 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

最近在某網(wǎng)站上看到一個視頻,是關(guān)于排序算法的可視化的,看著挺有意思的,也特別喜感。

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

附上源碼鏈接:

https://github.com/ZQPei/Sorting_Visualization

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

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

如何表示數(shù)組

如何得到隨機(jī)采樣數(shù)組,數(shù)組有無重復(fù)數(shù)據(jù)

如何實現(xiàn)排序算法

如何把數(shù)組可視化出來

一、如何表示數(shù)組

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

二、如何得到隨機(jī)采樣數(shù)組,數(shù)組有無重復(fù)數(shù)據(jù)

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

示例代碼:

import randomdata = list(range(100))data = random.choices(data, k=100)print(data)[52, 33, 45, 33, 48, 25, 68, 28, 78, 23, 78, 35, 24, 44, 69, 88, 66, 29, 82, 77, 84, 12, 19, 10, 27, 24, 57, 42, 71, 75, 25, 1, 77, 94, 44, 81, 86, 62, 25, 69, 97, 86, 56, 47, 31, 51, 40, 21, 41, 21, 17, 56, 88, 41, 92, 46, 56, 80, 23, 70, 49, 96, 83, 54, 16, 36, 82, 24, 68, 60, 16, 98, 16, 81, 10, 13, 11, 24, 68, 35, 56, 39, 23, 44, 6, 30, 3, 60, 56, 66, 38, 28, 47, 47, 25, 90, 89, 38, 68, 21]

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

可以用random.sample函數(shù),示例代碼:

data = random.sample(data, k=100)print(data)[49, 28, 56, 28, 44, 62, 81, 25, 48, 33, 54, 38, 30, 16, 13, 19, 23, 56, 60, 66, 41, 24, 68, 68, 77, 92, 78, 24, 66, 3, 80, 94, 78, 41, 84, 88, 21, 56, 25, 25, 75, 24, 38, 82, 31, 52, 23, 10, 71, 40, 27, 46, 33, 35, 56, 51, 1, 23, 12, 25, 89, 16, 21, 21, 11, 42, 47, 44, 81, 35, 86, 88, 29, 36, 77, 16, 39, 6, 57, 69, 96, 68, 24, 86, 97, 90, 69, 10, 68, 98, 56, 44, 83, 47, 70, 17, 47, 82, 60, 45]

這樣就可以得到無重復(fù)采樣數(shù)據(jù)了。

三、如何實現(xiàn)排序算法

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

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

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

基礎(chǔ)的插入法排序是兩重循環(huán),希爾排序是三重循環(huán),最外面一重循環(huán),控制增量gap,并逐步減少gap的值。二重循環(huán)從下標(biāo)為gap的元素開始比較,依次逐個跨組處理。最后一重循環(huán)是對組內(nèi)的元素進(jìn)行插入法排序。這樣進(jìn)行排序的優(yōu)點在于每次循環(huán),整個序列的元素都將小元素的值逐步向前移動,數(shù)值比較大的值向后移動。

示例代碼:

from data import DataSeqdef ShellSort(ds): assert isinstance(ds, DataSeq), "Type Error" Length = ds.length D = Length//2 while D>0: i=0 while i=1 and ds.data[j-D]>tmp: ds.SetVal(j, ds.data[j-D]) j-=D ds.SetVal(j, tmp) i+=D D//=2if __name__ == "__main__": ds=DataSeq(64) ds.Visualize() ds.StartTimer() ShellSort(ds) ds.StopTimer() ds.SetTimeInterval(0) ds.Visualize()

四、如何把數(shù)組可視化出來

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

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

為什么不用matplotlib?

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

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

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

示例代碼:

class DataSeq: WHITE = (255,255,255) RED = (0,0,255) BLACK = (0,0,0) YELLOW = (0,127,255) def __init__(self, Length, time_interval=1, sort_title="Figure", repeatition=False): pass def Getfigure(self): _bar_width = 5 figure = np.full((self.length*_bar_width,self.length*_bar_width,3), 255,dtype=np.uint8) for i in range(self.length): val = self.data[i] figure[-1-val*_bar_width:, i*_bar_width:i*_bar_width+_bar_width] = self.GetColor(val, self.length) self._bar_width = _bar_width self.figure = figure def _set_figure(self, idx, val): min_col = idx*self._bar_width max_col = min_col+self._bar_width min_row = -1-val*self._bar_width self.figure[ : , min_col:max_col] = self.WHITE self.figure[ min_row: , min_col:max_col] = self.GetColor(val, self.length) def SetVal(self, idx, val): self.data[idx] = val self._set_figure(idx, val) self.Visualize((idx,)) def Swap(self, idx1, idx2): self.data[idx1], self.data[idx2] = self.data[idx2], self.data[idx1] self._set_figure(idx1, self.data[idx1]) self._set_figure(idx2, self.data[idx2]) self.Visualize((idx1, idx2))

詳細(xì)代碼見github:

https://github.com/ZQPei/Sorting_Visualization

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

最后附上一張效果圖:

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2119

    瀏覽量

    75322
  • 可視化
    +關(guān)注

    關(guān)注

    1

    文章

    1264

    瀏覽量

    21866
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4827

    瀏覽量

    86760

原文標(biāo)題:3分鐘快速實現(xiàn):9種經(jīng)典排序算法的可視化

文章出處:【微信號:rgznai100,微信公眾號:rgznai100】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    C語言經(jīng)典排序算法總結(jié)

    本文將通過動態(tài)演示+代碼的形式系統(tǒng)地總結(jié)十大經(jīng)典排序算法。
    發(fā)表于 06-05 10:56 ?744次閱讀
    C語言<b class='flag-5'>經(jīng)典</b><b class='flag-5'>排序</b><b class='flag-5'>算法</b>總結(jié)

    可視化MES系統(tǒng)軟件

    是關(guān)鍵部分,可視化管理可幫助企業(yè)更直觀的挖掘隱藏的數(shù)據(jù)并有效管理企業(yè)。“制造物聯(lián)”是MES系統(tǒng)軟件更高階段的必然表現(xiàn)形式?!爸圃煳锫?lián)”與MES系統(tǒng)軟件的側(cè)重:(1)MES側(cè)重生產(chǎn)業(yè)務(wù)管理,制造物聯(lián)更關(guān)注
    發(fā)表于 11-30 19:55

    如何把AD中非可視化區(qū)域物件移到可視化區(qū)域?

    AD中非可視化區(qū)域物件怎么移到可視化區(qū)域???
    發(fā)表于 09-10 05:36

    基于STM的可視化門禁系統(tǒng)

    基于STM的可視化門禁系統(tǒng)
    發(fā)表于 03-07 09:49

    基于stm的可視化門禁系統(tǒng)

    基于stm的可視化門禁系統(tǒng)
    發(fā)表于 03-11 09:23

    Python數(shù)據(jù)可視化

    Python數(shù)據(jù)可視化:網(wǎng)易云音樂歌單
    發(fā)表于 07-19 08:30

    三維可視化的應(yīng)用和優(yōu)勢

    的數(shù)據(jù)體現(xiàn):將數(shù)據(jù)的每個信息進(jìn)行分類、排序、組合和優(yōu)化,操作界面更加符合人性操作流程,數(shù)據(jù)多個屬性或者變量視圖更加直觀。  數(shù)據(jù)信息展示更加直觀:大數(shù)據(jù)在三維可視化運(yùn)維系統(tǒng)中,是可以通過應(yīng)用一些簡短
    發(fā)表于 12-02 11:52

    常見的幾種可視化介紹

    說說常見的幾種可視化一、信息可視化信息可視化就是對抽象數(shù)據(jù)進(jìn)行直觀視覺呈現(xiàn)的研究,抽象數(shù)據(jù)既包含數(shù)值數(shù)據(jù),也包含非數(shù)值數(shù)據(jù)如文本信息、地圖信息等,它們可通過利用圖形圖像處理、人機(jī)交互、人工智能的技術(shù)
    發(fā)表于 07-12 07:49

    經(jīng)驗分享|BI數(shù)據(jù)可視化報表布局——容器

    容器功能是一用于數(shù)據(jù)可視化圖表排版的功能,主要作用對圖表進(jìn)行有效的布局調(diào)整,或者用于巧妙在同一地方安排多個不同類型的數(shù)據(jù)可視化圖表,供使用者點擊切換瀏覽。目前,在奧威BI軟件上一同有兩類容器功能
    發(fā)表于 03-15 17:10

    可視化大屏設(shè)計模板 | 主題皮膚(報表UI設(shè)計)

    報表UI模板) 內(nèi)容:提供大量可供免費(fèi)下載使用的數(shù)據(jù)可視化報表UI設(shè)計模板。常見的有以下幾種類型: 1、經(jīng)典藍(lán):以藍(lán)色為主色調(diào),搭配白色和灰色,整體風(fēng)格簡潔、大氣,適用于企業(yè)匯報、領(lǐng)導(dǎo)監(jiān)控等場景。 2
    發(fā)表于 09-12 10:10

    VegaGIS可視化系統(tǒng)的設(shè)計和實現(xiàn)

    針對跨平臺多層體系結(jié)構(gòu)的GIS系統(tǒng)要求,設(shè)計一GIS可視化系統(tǒng)架構(gòu)。該構(gòu)架實現(xiàn)了GIS可視化系統(tǒng)常規(guī)功能和跨操作系統(tǒng)平臺,具有動態(tài)使用多種繪制引擎、動態(tài)組裝繪制算法、帶
    發(fā)表于 04-10 09:04 ?16次下載

    新的平面矢量場可視化方法

    矢量場可視化是科學(xué)計算可視化的重要組成部分。提出了一新的平面矢量場可視化方法,該方法利用局部區(qū)域內(nèi)流線的近似平行性,將種子點的影響范圍擴(kuò)大,使一條流線能夠
    發(fā)表于 08-10 10:05 ?13次下載

    Radviz可視化聚類分析方法

    ,提出將原始維度劃分為多個新維度來拓展Radviz圓周上的維度排序空間。從而獲得比原始維度條件下更好的可視化聚類效果,該維度劃分方法首先計算數(shù)據(jù)在每個原始維度的概率分布直方圖,然后使用均值漂移算法對直方圖進(jìn)行劃分,最后根據(jù)劃分結(jié)
    發(fā)表于 01-14 14:04 ?0次下載

    可視化技術(shù)有哪些

    完整的地理空間信息可視化概念主要包括科學(xué)計算可視化、數(shù)據(jù)可視化和信息可視化。可視化技術(shù)作為解釋大量數(shù)據(jù)最有效的手段而率先被科學(xué)與工程計算領(lǐng)域
    發(fā)表于 02-05 09:09 ?3931次閱讀

    使用Arduino和LED燈帶可視化排序算法

    電子發(fā)燒友網(wǎng)站提供《使用Arduino和LED燈帶可視化排序算法.zip》資料免費(fèi)下載
    發(fā)表于 12-01 09:41 ?0次下載
    使用Arduino和LED燈帶<b class='flag-5'>可視化</b><b class='flag-5'>排序</b><b class='flag-5'>算法</b>