优先队列

优先队列可以用链表、二叉查找树、二叉堆等实现。

下面我们用二叉堆实现优先队列,二叉堆的具体定义参考堆排序那篇博客:

 

python代码

class MinHeap(object):
    def __init__(self):
        self.heap = []

    def __len__(self):
        return len(self.heap)

    def push(self, key):
        self.heap.append(key)
        self._up(len(self.heap) - 1)

    def pop(self):
        res = self.heap[0]
        x = self.heap.pop()
        if len(self.heap):
            self.heap[0] = x
            self._down(0)
        return res

    def _up(self, i):
        if i > 0:
            parent = (i-1)//2
            if self.heap[i] < self.heap[parent]:
                self.heap[i], self.heap[parent] = self.heap[parent], self.heap[i]
                self._up(parent)

    def _down(self, i):
        left = 2 * i + 1
        right = 2 * i + 2
        small = i
        if left < len(self.heap) and self.heap[left] < self.heap[small]:
            small = left
        if right < len(self.heap) and self.heap[right] < self.heap[small]:
            small = right
        if small != i:
            self.heap[i], self.heap[small] = self.heap[small], self.heap[i]
            self._down(small)

 

posted @ 2019-07-10 19:19  xd_xumaomao  阅读(140)  评论(0编辑  收藏  举报