欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

看下代碼:

# 構建二叉堆 
def binaryHeap(arr, lenth, m): 
 temp = arr[m] # 當前結點的值 
 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("二叉堆的物理順序為:") 
 print(arr) # 輸出二叉堆的物理順序 
 
 
if __name__ == '__main__': 
 arr = [2, 87, 39, 49, 34, 62, 53, 6, 44, 98] 
 
 heapsort(arr, len(arr))

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

# 構建二叉堆
def binaryHeap(arr, lenth, m):
  temp = arr[m] # 當前結點的值
  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("二叉堆的物理順序為:")
  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) # 輸出經過堆排序之后的物理順序

  data = pop(arr)
  print(data)

  print(arr)

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

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)) # 存入一個三元組
    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官網

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

相關文章

  • 詳解如何利用Python進行客戶分群分析

    詳解如何利用Python進行客戶分群分析

    每個電子商務數(shù)據分析師必須掌握的一項數(shù)據聚類技能,如果你是一名在電子商務公司工作的數(shù)據分析師,從客戶數(shù)據中挖掘潛在價值,來提高客戶留存率很可能就是你的工作任務之一。這篇就來告訴你如何將客戶分成不同的群組,并在一段時間內觀察每個群組的留存率
    2023-02-02
  • Python基于回溯法子集樹模板實現(xiàn)8皇后問題

    Python基于回溯法子集樹模板實現(xiàn)8皇后問題

    這篇文章主要介紹了Python基于回溯法子集樹模板實現(xiàn)8皇后問題,簡單說明了8皇后問題的原理并結合實例形式分析了Python回溯法子集樹模板解決8皇后問題的具體實現(xiàn)技巧,需要的朋友可以參考下
    2017-09-09
  • Python requests及aiohttp速度對比代碼實例

    Python requests及aiohttp速度對比代碼實例

    這篇文章主要介紹了Python requests及aiohttp速度對比代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • numpy中np.append()函數(shù)用法小結

    numpy中np.append()函數(shù)用法小結

    在numpy的函數(shù)庫中,np.append()函數(shù)是一個常用的數(shù)組操作函數(shù),它在進行數(shù)組操作時能夠將兩個數(shù)組進行拼接,并返回一個拼接后的新數(shù)組,下面就來介紹一下具體用法,感興趣的可以了解一下
    2023-11-11
  • Python 中對 XML 文件的編碼轉換問題

    Python 中對 XML 文件的編碼轉換問題

    這篇文章主要介紹了Python 中對 XML 文件的編碼轉換問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • Python中注釋(多行注釋和單行注釋)的用法實例

    Python中注釋(多行注釋和單行注釋)的用法實例

    這篇文章主要給大家介紹了關于Python中注釋(多行注釋和單行注釋)用法的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Python具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-08-08
  • python的sys.path模塊路徑添加方式

    python的sys.path模塊路徑添加方式

    這篇文章主要介紹了python的sys.path模塊路徑添加方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • python數(shù)字圖像處理之圖像簡單濾波實現(xiàn)

    python數(shù)字圖像處理之圖像簡單濾波實現(xiàn)

    這篇文章主要為大家介紹了python數(shù)字圖像處理之圖像簡單濾波實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • django restframework使用redis實現(xiàn)token認證

    django restframework使用redis實現(xiàn)token認證

    本文主要介紹了django restframework使用redis實現(xiàn)token認證,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • python解析中國天氣網的天氣數(shù)據

    python解析中國天氣網的天氣數(shù)據

    最近學習python 感覺這門腳本語言十分靈活 而且功能十分強大 尤其是他re庫用于正則匹配十分強大,寫了個例子解析中國天氣網
    2014-03-03

最新評論