class MaxHeap(object):
def __init__(self,maxsize = None):
self.maxsize = maxsize
self._elements = []
self._cnt = 0
def __len__(self):
return self._cnt
def add(self,value):
if self._cnt>self.maxsize:
raise Exception('full')
self._elements.append(value)
# print(self._cnt)
self._cnt +=1
self._swiftup(self._cnt-1)
# print(self._elements)
def _swiftup(self,pos):
if pos >0:
parent = int((pos - 1) / 2)
while self._elements[pos] > self._elements[parent]:
self._elements[pos],self._elements[parent] = self._elements[parent],self._elements[pos]
pos = parent
parent = int((pos - 1) / 2)
def extract(self):
if self._cnt == 0:
raise Exception('empty')
value = self._elements[0]
self._cnt -=1
self._elements[0] = self._elements[self._cnt]
self._swiftdown(0)
#print(self._elements)
return value
def _swiftdown(self,pos):
left = pos*2+1
right = pos*2+2
large = pos
if left <self._cnt and self._elements[large]<self._elements[left] and self._elements[left]>self._elements[right]: #有左孩子
large = left
elif right <self._cnt and self._elements[large]<self._elements[right] and self._elements[left]<self._elements[right]:
large = right
if large!=pos:
self._elements[pos],self._elements[large] = self._elements[large],self._elements[pos]
self._swiftdown(large)
#测试
def test_myheap():
import random
n=10
h = MaxHeap(10)
for i in range(6):
h.add(i)
for i in reversed(range(6)):
t = h.extract()
#print(t)
def heap_sort(s):
l = len(s)
h =MaxHeap(l)
for i in s:
h.add(i)
res = []
for i in range(l):
res.append(h.extract())
print(res)
print(res[::-1])
s = [2,6,4,7,9]
heap_sort(s)
#优先级队列
class PriorityQueue(object):
def __init__(self,maxsize = None):
self.maxsize = maxsize
self.maxheap = MaxHeap(maxsize)
def push(self,p,value):
entry = (p,value)
self.maxheap.add(entry)
def pop(self):
return self.maxheap.extract()
def isempty(self):
return len(self.maxheap)==0
def testpq():
size =10
q = PriorityQueue(10)
q.push(5,'a')
q.push(4,'a')
q.push(5,'b')
q.push(3,'a')
q.push(0,'t')
res = []
while not q.isempty(): #在这里要注意是isempty 而不是not None None不是0,也不是空字符串***
print(q.pop())
#print(res)
testpq()
这边实现的是一个最大堆
优先级队列可以利用元组比较规则,从第一个到最后逐个比较 推入堆实现