'''
利用heapq模块的heappop和heappush实现简易的优先级排序,可以简单了解下堆排序的原理
'''
import heapq
class PriorityQueue():
def__init__(self):
self.__queue=[]
self.__index=0
defpush(self,item,priority):
'''
heapq.heappush(heap, item)
将值item推到heap上,保持堆不变。
:param item:
:param priority:
:return:
'''
heapq.heappush(self.__queue, (-priority,self.__index,item))
'''
index的作用是当list[0]相同时,比较第二位,按照顺序进行堆排序,不然就报错了
'''
#self.__index -= 1
self.__index+=1
print(self.__index)
print(self.__queue)
defpop(self):
'''
heapq.heappop(heap)
从heap中弹出并返回最小的项(默认是从第一个排序的),保持堆不变。如果堆为空,则会引发IndexError。
要访问最小的项,不需要弹出它,请使用heap [0]。
:return:
'''
#print(heapq.heappop(self.__queue)[-1])
#return heapq.heappop(self.__queue)[-1]
#使用-1和使用2是一样的效果
return heapq.heappop(self.__queue)[2]
class Item():
def__init__(self,name):
self.name=name
def__repr__(self):
return'Item({!r})'.format(self.name)
__str__=__repr__
if__name__=='__main__':
'''
仔细观察可以发现,第一个pop()操作返回优先级最高的元素。
另外注意到如果两个有着相同优先级的元素( foo和grok ),pop操作按照它们被插入到队列的顺序返回的。
'''
q=PriorityQueue()
q.push(Item('foo'),1)
q.push(Item('bar'),5)
q.push(Item('spam'),4)
q.push(Item('grok'),1)
print(q.pop())
print(q.pop())
print(q.pop())
print(q.pop())