class MinHeap(object): def __init__(self, iterable=()): self.array = [None] self.array.extend(iterable) self.build() def build(self): a, size = self.array, self.size() for i in xrange(size / 2, 0, -1): c = 2 * i while c <= size: if c + 1 <= size and a[c+1] < a[c]: c += 1 if a[c] > a[c/2]: break a[c], a[c/2] = a[c/2], a[c] c *= 2 def insert(self, k): self.array.append(k) a, i = self.array, self.size() while i > 1 and k < a[i/2]: a[i] = a[i/2] i /= 2 a[i] = k def pop(self): size = self.size() if size == 0: raise IndexError('pop from empty heap') a = self.array res = a[1] last = a.pop() size -= 1 if size > 0: c = 2 * 1 while c <= size: if c + 1 <= size and a[c+1] < a[c]: c += 1 if a[c] >= last: break a[c/2] = a[c] c *= 2 a[c/2] = last return res def size(self): return len(self.array) - 1 if __name__ == '__main__': from random import shuffle data = range(50) shuffle(data) PRint data h = MinHeap(data) for _ in xrange(len(data)): print h.pop() |
新闻热点
疑难解答