最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python下實(shí)現(xiàn)二叉堆以及堆排序的示例

 更新時(shí)間:2017年09月29日 08:30:53   作者:又見阿郎  
下面小編就為大家?guī)硪黄猵ython下實(shí)現(xiàn)二叉堆以及堆排序的示例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

堆是一種特殊的樹形結(jié)構(gòu), 堆中的數(shù)據(jù)存儲滿足一定的堆序。堆排序是一種選擇排序, 其算法復(fù)雜度, 時(shí)間復(fù)雜度相對于其他的排序算法都有很大的優(yōu)勢。

堆分為大頭堆和小頭堆, 正如其名, 大頭堆的第一個(gè)元素是最大的, 每個(gè)有子結(jié)點(diǎn)的父結(jié)點(diǎn), 其數(shù)據(jù)值都比其子結(jié)點(diǎn)的值要大。小頭堆則相反。

我大概講解下建一個(gè)樹形堆的算法過程:

找到N/2 位置的數(shù)組數(shù)據(jù), 從這個(gè)位置開始, 找到該節(jié)點(diǎn)的左子結(jié)點(diǎn)的索引, 先比較這個(gè)結(jié)點(diǎn)的下的子結(jié)點(diǎn), 找到最大的那個(gè), 將最大的子結(jié)點(diǎn)的索引賦值給左子結(jié)點(diǎn), 然后將最大的子結(jié)點(diǎn)和父結(jié)點(diǎn)進(jìn)行對比, 如果比父結(jié)點(diǎn)大, 與父節(jié)點(diǎn)交換數(shù)據(jù)。當(dāng)然, 我只是大概說了下實(shí)現(xiàn), 在此過程中, 還需要考慮結(jié)點(diǎn)不存在的情況。

看下代碼:

# 構(gòu)建二叉堆 
def binaryHeap(arr, lenth, m): 
 temp = arr[m] # 當(dāng)前結(jié)點(diǎn)的值 
 while(2*m+1 < lenth): 
 lchild = 2*m+1 
 if lchild != lenth - 1 and arr[lchild] < arr[lchild + 1]: 
 lchild = lchild + 1 
 if temp < arr[lchild]: 
 arr[m] = arr[lchild] 
 else: 
 break 
 m = lchild 
 arr[m] = temp 
 
 
def heapsort(arr, length): 
 i = int(len(arr)/2) 
 while(i >= 0): 
 binaryHeap(arr, len(arr), i) 
 i = i - 1 
 
 print("二叉堆的物理順序?yàn)?") 
 print(arr) # 輸出二叉堆的物理順序 
 
 
if __name__ == '__main__': 
 arr = [2, 87, 39, 49, 34, 62, 53, 6, 44, 98] 
 
 heapsort(arr, len(arr))

堆排序過程就是依次將最后的結(jié)點(diǎn)與首個(gè)節(jié)點(diǎn)進(jìn)行對比交換:

# 構(gòu)建二叉堆
def binaryHeap(arr, lenth, m):
  temp = arr[m] # 當(dāng)前結(jié)點(diǎn)的值
  while(2*m+1 < lenth):
    lchild = 2*m+1
    if lchild != lenth - 1 and arr[lchild] < arr[lchild + 1]:
      lchild = lchild + 1
    if temp < arr[lchild]:
      arr[m] = arr[lchild]
    else:
      break
    m = lchild
  arr[m] = temp


def heapsort(arr, length):
  i = int(len(arr)/2)
  while(i >= 0):
    binaryHeap(arr, len(arr), i)
    i = i - 1

  print("二叉堆的物理順序?yàn)?")
  print(arr) # 輸出二叉堆的物理順序

  i = length-1
  while(i > 0):
    arr[i], arr[0] = arr[0], arr[i] # 變量交換
    binaryHeap(arr, i, 0)
    i = i - 1560


def pop(arr):
  first = arr.pop(0)
  return first


if __name__ == '__main__':
  arr = [2, 87, 39, 49, 34, 62, 53, 6, 44, 98]

  heapsort(arr, len(arr))

  print("堆排序后的物理順序")
  print(arr) # 輸出經(jīng)過堆排序之后的物理順序

  data = pop(arr)
  print(data)

  print(arr)

python封裝了一個(gè)堆模塊, 我們使用該模塊可以很高效的實(shí)現(xiàn)一個(gè)優(yōu)先隊(duì)列

import heapq


class Item:
  def __init__(self, name):
    self.name = name

  def __repr__(self):
    return 'Item({!r})'.format(self.name)


class PriorityQueue:
  def __init__(self):
    self._queue = []
    self._index = 0

  def push(self, item, priority):
    heapq.heappush(self._queue, (-priority, self._index, item)) # 存入一個(gè)三元組
    self._index += 1

  def pop(self):
    return heapq.heappop(self._queue)[-1] # 逆序輸出


if __name__ == '__main__':
  p = PriorityQueue()
  p.push(Item('foo'), 1)
  p.push(Item('bar'), 5)
  p.push(Item('spam'), 4)
  p.push(Item('grok'), 1)

  print(p.pop())
  print(p.pop())

具體請看heapq官網(wǎng)

以上這篇python下實(shí)現(xiàn)二叉堆以及堆排序的示例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python執(zhí)行數(shù)據(jù)庫的查詢操作實(shí)例講解

    python執(zhí)行數(shù)據(jù)庫的查詢操作實(shí)例講解

    在本篇文章里小編給大家整理了一篇關(guān)于python執(zhí)行數(shù)據(jù)庫的查詢操作實(shí)例講解內(nèi)容,有需要的朋友們可以參考學(xué)習(xí)下。
    2021-10-10
  • 深入了解Python的異常處理機(jī)制

    深入了解Python的異常處理機(jī)制

    這篇文章主要為大家介紹了Python的異常處理機(jī)制,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • Matplotlib可視化之添加讓統(tǒng)計(jì)圖變得簡單易懂的注釋

    Matplotlib可視化之添加讓統(tǒng)計(jì)圖變得簡單易懂的注釋

    今天給大家?guī)淼奈恼率顷P(guān)于Python的,文章圍繞著Python Matplotlib可視化展開,文中非常詳細(xì)的介紹了如何給統(tǒng)計(jì)圖添加注釋,需要的朋友可以參考下
    2021-06-06
  • 如何利用Pandas刪除某列指定值所在的行

    如何利用Pandas刪除某列指定值所在的行

    工作中通常會遇到大量的數(shù)據(jù)集需要處理,其中的一項(xiàng)就是將含有某些數(shù)據(jù)的行刪除掉,下面這篇文章主要給大家介紹了關(guān)于如何利用Pandas刪除某列指定值所在的行的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • python爬不同圖片分別保存在不同文件夾中的實(shí)現(xiàn)

    python爬不同圖片分別保存在不同文件夾中的實(shí)現(xiàn)

    這篇文章主要介紹了python爬不同圖片分別保存在不同文件夾中的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Python中的魔術(shù)方法__new__詳解

    Python中的魔術(shù)方法__new__詳解

    這篇文章主要介紹了Python中的魔術(shù)方法__new__的使用,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • python實(shí)現(xiàn)發(fā)送form-data數(shù)據(jù)的方法詳解

    python實(shí)現(xiàn)發(fā)送form-data數(shù)據(jù)的方法詳解

    這篇文章主要介紹了python實(shí)現(xiàn)發(fā)送form-data數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了Python發(fā)送form-data數(shù)據(jù)的相關(guān)操作步驟、實(shí)現(xiàn)方法與注意事項(xiàng),需要的朋友可以參考下
    2019-09-09
  • python requests 測試代理ip是否生效

    python requests 測試代理ip是否生效

    這篇文章主要介紹了python requests 測試代理ip是否生效的相關(guān)資料,需要的朋友可以參考下
    2018-07-07
  • 卷積神經(jīng)網(wǎng)絡(luò)如何實(shí)現(xiàn)提取特征

    卷積神經(jīng)網(wǎng)絡(luò)如何實(shí)現(xiàn)提取特征

    這篇文章主要介紹了卷積神經(jīng)網(wǎng)絡(luò)如何實(shí)現(xiàn)提取特征問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Python數(shù)學(xué)符號計(jì)算庫SymPy使用方法詳解

    Python數(shù)學(xué)符號計(jì)算庫SymPy使用方法詳解

    SymPy?是一個(gè)?Python?的數(shù)學(xué)符號計(jì)算庫,提供了強(qiáng)大的工具來進(jìn)行符號數(shù)學(xué)運(yùn)算、代數(shù)操作、求解方程、微積分、矩陣運(yùn)算等,它廣泛應(yīng)用于數(shù)學(xué)教學(xué)、物理學(xué)、工程學(xué)、統(tǒng)計(jì)學(xué)和概率論等領(lǐng)域,本文將結(jié)合具體案例,詳細(xì)介紹?SymPy?的使用方法,需要的朋友可以參考下
    2024-08-08

最新評論

新津县| 垦利县| 中江县| 延津县| 浑源县| 清河县| 汽车| 澄江县| 沙雅县| 根河市| 平罗县| 淄博市| 会理县| 新宁县| 宁阳县| 大荔县| 枝江市| 神池县| 周至县| 景谷| 张家川| 惠州市| 增城市| 沾益县| 睢宁县| 江城| 称多县| 安西县| 盐山县| 江油市| 从化市| 广平县| 白河县| 南汇区| 金山区| 伊通| 屯昌县| 沈丘县| 明水县| 咸宁市| 海宁市|