• 招生咨詢熱線:4008-569-579 
  • 手機(jī)版
    用手機(jī)掃描二維碼直達(dá)商品手機(jī)版
招生咨詢熱線
4008-569-579
機(jī)構(gòu)主頁(yè) > 培訓(xùn)資料 > 怎么用python來實(shí)現(xiàn)排序算法的可視化的
機(jī)構(gòu)主頁(yè) > 培訓(xùn)資料>怎么用python來實(shí)現(xiàn)排序算法的可視化的

怎么用python來實(shí)現(xiàn)排序算法的可視化的

來源:廣州達(dá)內(nèi)教育        時(shí)間:2023-05-30        熱度:35℃        返回列表

      Python培訓(xùn)機(jī)構(gòu)達(dá)內(nèi)科技表示,在人工智能化的時(shí)代,現(xiàn)在的python已經(jīng)成為開發(fā)行業(yè)比較吃香的一門開發(fā)語(yǔ)言了。對(duì)于想要學(xué)習(xí)python的人來說當(dāng)然是想要了解更多關(guān)于python技術(shù)方面的知識(shí)點(diǎn)了,下面達(dá)內(nèi)科技的小編就來給大家整理一篇關(guān)于怎么用python來實(shí)現(xiàn)排序算法的可視化技術(shù),讓大家可以更加直觀的了解python。

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


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


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


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


  示例代碼:


  import random


  data = 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]


  但是以上代碼有個(gè)問題,random.choices是對(duì)一個(gè)序列進(jìn)行重復(fù)采樣,得到的數(shù)組存在重復(fù)數(shù)據(jù),那如果不希望存在重復(fù)數(shù)據(jù),而是希望進(jìn)行無(wú)重復(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]


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


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


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


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


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


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


  示例代碼:


  from data import DataSeq


  def ShellSort(ds):


  assert isinstance(ds, DataSeq), "Type Error"


  Length = ds.length


  D = Length//2


  while D>0:


  i=0


  while i<Length:


  tmp = ds.data[i]


  j=i


  while j>=1 and ds.data[j-D]>tmp:


  ds.SetVal(j, ds.data[j-D])


  j-=D


  ds.SetVal(j, tmp)


  i+=D


  D//=2


  if __name__ == "__main__":


  ds=DataSeq(64)


  ds.Visualize()


  ds.StartTimer()


  ShellSort(ds)


  ds.StopTimer()


  ds.SetTimeInterval(0)


  ds.Visualize()


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


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


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


  為什么不用matplotlib?


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


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


  數(shù)組中主要有兩種操作,一種是對(duì)某個(gè)idx賦值,一種是交換某兩個(gè)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))


  以上就是達(dá)內(nèi)科技的小編給大家整理的關(guān)于怎么用python來實(shí)現(xiàn)排序算法的可視化的文章了。如果說你想要了解更多關(guān)于python技術(shù)上面的問題的話,那么可以點(diǎn)擊我們文章下面的獲取試聽資格按鈕來獲取和我們python講師面對(duì)面交流的機(jī)會(huì),可以解答你更多的疑惑。

電話咨詢

電話咨詢

咨詢電話:
4008-569-579
回到頂部

回到頂部