Python笔记:二叉堆及堆排序

# binary heap
from math import log

class 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值