Python 技巧(二) 最小堆实现以及维护一个大小为100的最小堆

#!/usr/bin/env python
#coding:utf-8
__author__ = 'sws'

class MinHeap:
    '''
        最小堆


    '''
    def __init__(self, a_list = []):
        self.heap_list = [0]
        self.length = 0
        self.build_heap(a_list)

    def _fix_up(self, i):
        while i//2 > 0:
            if self.heap_list[i] < self.heap_list[i//2]:
                self.heap_list[i//2], self.heap_list[i] = self.heap_list[i//2], self.heap_list[i]
            i //= 2

    def insert(self, value):
        self.heap_list.append(value)
        self.length += 1
        self._fix_up(self.length)

    def _fix_down(self, i):
        while i*2 < self.length:
            mi = self._min_child(i)
            if self.heap_list[mi] < self.heap_list[i]:
                self.heap_list[i], self.heap_list[mi] = self.heap_list[mi], self.heap_list[i]
            i = mi

    def _min_child(self, i):
        if i * 2 + 1 < self.length:
            return i * 2
        else:
            return i * 2 + 1 if self.heap_list[i*2+1] < self.heap_list[i*2] else i * 2

    def del_min(self):
        rel_val = self.heap_list[1]
        self.heap_list[1] = self.heap_list[self.length]
        self.length -= 1
        self._fix_down(self.length)
        self.heap_list.pop()
        return rel_val

    def build_heap(self, a_list):
        self.length = len(a_list)
        self.heap_list.extend(a_list)
        i = self.length // 2
        while i > 0:
            self._fix_down(i)
            i -= 1

    def __repr__(self):
        return repr(self.heap_list[1:])
a = list()

a_list=[9, 6, 5, 2, 3]

min_heap = MinHeap(a_list)

print(min_heap)

你可能感兴趣的:(Python)