python下實現(xiàn)二叉堆以及堆排序的示例
堆是一種特殊的樹形結(jié)構(gòu), 堆中的數(shù)據(jù)存儲滿足一定的堆序。堆排序是一種選擇排序, 其算法復(fù)雜度, 時間復(fù)雜度相對于其他的排序算法都有很大的優(yōu)勢。
堆分為大頭堆和小頭堆, 正如其名, 大頭堆的第一個元素是最大的, 每個有子結(jié)點的父結(jié)點, 其數(shù)據(jù)值都比其子結(jié)點的值要大。小頭堆則相反。
我大概講解下建一個樹形堆的算法過程:
找到N/2 位置的數(shù)組數(shù)據(jù), 從這個位置開始, 找到該節(jié)點的左子結(jié)點的索引, 先比較這個結(jié)點的下的子結(jié)點, 找到最大的那個, 將最大的子結(jié)點的索引賦值給左子結(jié)點, 然后將最大的子結(jié)點和父結(jié)點進(jìn)行對比, 如果比父結(jié)點大, 與父節(jié)點交換數(shù)據(jù)。當(dāng)然, 我只是大概說了下實現(xiàn), 在此過程中, 還需要考慮結(jié)點不存在的情況。
看下代碼:
# 構(gòu)建二叉堆
def binaryHeap(arr, lenth, m):
temp = arr[m] # 當(dāng)前結(jié)點的值
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é)點與首個節(jié)點進(jìn)行對比交換:
# 構(gòu)建二叉堆
def binaryHeap(arr, lenth, m):
temp = arr[m] # 當(dāng)前結(jié)點的值
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) # 輸出經(jīng)過堆排序之后的物理順序
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官網(wǎng)
以上這篇python下實現(xiàn)二叉堆以及堆排序的示例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python requests及aiohttp速度對比代碼實例
這篇文章主要介紹了Python requests及aiohttp速度對比代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07
numpy中np.append()函數(shù)用法小結(jié)
在numpy的函數(shù)庫中,np.append()函數(shù)是一個常用的數(shù)組操作函數(shù),它在進(jìn)行數(shù)組操作時能夠?qū)蓚€數(shù)組進(jìn)行拼接,并返回一個拼接后的新數(shù)組,下面就來介紹一下具體用法,感興趣的可以了解一下2023-11-11
Python 中對 XML 文件的編碼轉(zhuǎn)換問題
這篇文章主要介紹了Python 中對 XML 文件的編碼轉(zhuǎn)換問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03
python數(shù)字圖像處理之圖像簡單濾波實現(xiàn)
這篇文章主要為大家介紹了python數(shù)字圖像處理之圖像簡單濾波實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
django restframework使用redis實現(xiàn)token認(rèn)證
本文主要介紹了django restframework使用redis實現(xiàn)token認(rèn)證,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09
python解析中國天氣網(wǎng)的天氣數(shù)據(jù)
最近學(xué)習(xí)python 感覺這門腳本語言十分靈活 而且功能十分強(qiáng)大 尤其是他re庫用于正則匹配十分強(qiáng)大,寫了個例子解析中國天氣網(wǎng)2014-03-03

