Python笔记:二叉堆及堆排序

来源:互联网 发布:微信数据保存到sd卡 编辑:程序博客网 时间:2024/05/04 11:41
# binary heapfrom math import logclass BinaryHeap(object):    def __init__(self):        self.data = [0]        self.size = 0    def percUp(self, c):        while c//2 > 0:            if self.data[c] < self.data[c//2]:                tmp = self.data[c]                self.data[c] = self.data[c//2]                self.data[c//2] = tmp            c //= 2    def insert(self, v):        self.data.append(v)        self.size += 1        self.percUp(self.size)    def minChild(self, p):        if p * 2 + 1 > self.size:            return p * 2        else:            if self.data[p*2] > self.data[p*2+1]:                return p * 2 + 1            else:                return p * 2    def percDown(self, p):        while p * 2 <= self.size:            mc = self.minChild(p)            if self.data[p] > self.data[mc]:                tmp = self.data[p]                self.data[p] = self.data[mc]                self.data[mc] = tmp            p = mc    def buildHeap(self, nlist):        self.data += nlist        self.size += len(nlist)        n = self.size // 2        while n > 0:            self.percDown(n)            n -= 1    def delMin(self):        if self.size == 0:            return None        retval = self.data[1]        self.data[1] = self.data[self.size]        self.size -= 1        self.data.pop()        self.percDown(1)        return retval    def sort(self):        retval = []        data = self.data[:]        size = self.size        rv = self.delMin()        while rv != None:            retval.append(rv)            rv = self.delMin()        self.data = data        self.size = size        return retval    def printHeap(self):        dt = []        for i in range(1, len(self.data)):            dt.append(self.data[i])            if log(i+1, 2) % 1 == 0:                print dt                dt = []        print dt            
参考《Problem Solving with Algorithms and Data Structures》中二叉堆的Python实现方法,利用删除最小项完成堆排序。
0 0
原创粉丝点击