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()
刘硕老师Python精品课程:
《Python高级编程技巧实战》:
http://coding.imooc.com/class/62.html
《Python算法实战视频课程》:
http://study.163.com/course/courseMain.htm?courseId=1003617013
《Python科学计算—NumPy实战课程》:
http://edu.51cto.com/course/course_id-5046.html
熊猫TV直播间: