python 堆、堆排序、优先级队列

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()

这边实现的是一个最大堆
优先级队列可以利用元组比较规则,从第一个到最后逐个比较 推入堆实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值