乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      我用 Python,3分鐘快速實(shí)現(xiàn),9 種經(jīng)典排序算法的可視化

       LibraryPKU 2019-01-24

      (給Python開發(fā)者加星標(biāo),提升Python技能


      作者: 戀習(xí)Python/ 丁彥軍 (本文來自作者投稿)


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

      6分鐘演示15種排序算法


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


      附上源碼鏈接:

      https://github.com/ZQPei/Sorting_Visualization

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


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


      • 如何表示數(shù)組

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

      • 如何實(shí)現(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計(jì)算時間,再次就不詳細(xì)論述。


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


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


      示例代碼:

      import random
      data = list(range(100))
      data = random.choices(data, k=100)
      print(data)
      [523345334825682878237835244469886629827784121910
      2724574271752517794448186622569978656473151402141
      21175688419246568023704996835416368224686016981681,
       101311246835563923446303605666382847472590893868
      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)
      [492856284462812548335438301613192356606641246868,
       77927824663809478418488215625257524388231522310
      71402746333556511231225891621211142474481358688
      29367716396576996682486979069106898564483477017
      47826045]

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


      三、如何實(shí)現(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)點(diǎn)在于每次循環(huán),整個序列的元素都將小元素的值逐步向前移動,數(shù)值比較大的值向后移動。

      示例代碼:

      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ù)中每次移動數(shù)組后將數(shù)組可視化并輸出。


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


      為什么不用matplotlib?


      因?yàn)樵谂判蜻^程中,每次修改數(shù)組,都希望能夠?qū)崟r修改圖片并輸出,matplotlib確實(shí)很方便,但是matplotlib的效率實(shí)在是不高,而且每次修改數(shù)組前后的兩幅圖片其實(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下面留言勾搭。


      最后附上一張效果圖:



      【本文作者】


      丁彥軍 一名癡戀于 Python 的碼農(nóng),個人公號:「戀習(xí)Python」,在這里我們一起用Python 做些有意義的事。


        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多