# binary heap
from math import log
class BinaryHeap(object):
def __init__(self):
self.data = [0]
self.size = 0
def percUp(self, c):
while c//2 > 0:
if self.data[c] < self.data[c//2]:
tmp = self.data[c]
self.data[c] = self.data[c//2]
self.data[c//2] = tmp
c //= 2
def insert(self, v):
self.data.append(v)
self.size += 1
self.percUp(self.size)
def minChild(self, p):
if p * 2 + 1 > self.size:
return p * 2
else:
if self.data[p*2] > self.data[p*2+1]:
return p * 2 + 1
else:
return p * 2
def percDown(self, p):
while p * 2 <= self.size:
mc = self.minChild(p)
if self.data[p] > self.data[mc]:
tmp = self.data[p]
self.data[p] = self.data[mc]
self.data[mc] = tmp
p = mc
def buildHeap(self, nlist):
self.data += nlist
self.size += len(nlist)
n = self.size // 2
while n > 0:
self.percDown(n)
n -= 1
def delMin(self):
if self.size == 0:
return None
retval = self.data[1]
self.data[1] = self.data[self.size]
self.size -= 1
self.data.pop()
self.percDown(1)
return retval
def sort(self):
retval = []
data = self.data[:]
size = self.size
rv = self.delMin()
while rv != None:
retval.append(rv)
rv = self.delMin()
self.data = data
self.size = size
return retval
def printHeap(self):
dt = []
for i in range(1, len(self.data)):
dt.append(self.data[i])
if log(i+1, 2) % 1 == 0:
print dt
dt = []
print dt
参考《Problem Solving with Algorithms and Data Structures》中二叉堆的Python实现方法,利用删除最小项完成堆排序。
Python笔记:二叉堆及堆排序
最新推荐文章于 2023-12-25 08:00:00 发布