class MinHeap(object):
def __init__(self, iterable=()):
self.array = [None]
self.array.extend(iterable)
self.build()
def build(self):
a, size = self.array, self.size()
for i in xrange(size / 2, 0, -1):
c = 2 * i
while c <= size:
if c + 1 <= size and a[c+1] < a[c]:
c += 1
if a[c] > a[c/2]:
break
a[c], a[c/2] = a[c/2], a[c]
c *= 2
def insert(self, k):
self.array.append(k)
a, i = self.array, self.size()
while i > 1 and k < a[i/2]:
a[i] = a[i/2]
i /= 2
a[i] = k
def pop(self):
size = self.size()
if size == 0:
raise IndexError('pop from empty heap')
a = self.array
res = a[1]
last = a.pop()
size -= 1
if size > 0:
c = 2 * 1
while c <= size:
if c + 1 <= size and a[c+1] < a[c]:
c += 1
if a[c] >= last:
break
a[c/2] = a[c]
c *= 2
a[c/2] = last
return res
def size(self):
return len(self.array) - 1
if __name__ == '__main__':
from random import shuffle
data = range(50)
shuffle(data)
print data
h = MinHeap(data)
for _ in xrange(len(data)):
print h.pop()
點(diǎn)擊查看更多內(nèi)容
4人點(diǎn)贊
評論
評論
共同學(xué)習(xí),寫下你的評論
評論加載中...
作者其他優(yōu)質(zhì)文章
正在加載中
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦