算法导论程序8--堆(Python)

(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树。树上的每一个结点对应数组中的每一个元素。除了最底层外,该树是完全充满的,而且是从左到右填充。

树的根结点:A[0]。给定一个下标i,很容易得到它的父结点、左孩子和右孩子的下标。


import math
class heapsort:
    def __init__(self,a_A):
        self.list=a_A
    def parent(self,i):
        return math.floor((i-1)/2)
    def left(self,i):
        return 2*i+1
    def right(self,i):
        return 2*i+2
运行:

>>> A=[16,14,10,8,7,9,3,2,4,1]
>>> p=heapsort(A)
>>> p.left(1)
3
>>> p.right(1)
4
>>> 

最大堆:

最大堆性质是指除了根以外的所有结点i都要满足:

A[parent(i)]>=A[i]


最小堆:

最小堆性质是指除了根结点以外的所有结点i都有:

A[parent(i)]<=A[i]

最小堆中的最小元素存放在根结点中。


我们定义一个堆中的结点的高度就为该结点到叶结点最长简单路径上边的数目。进而我们可以把堆的高度定义为根结点的高度。


既然一个包含n个元素的堆可以看做一棵完全二叉树,那么堆的高度是下取整lgn。


堆结构上的一些基本操作的运行时间至多与树的高度成正比,即时间复杂度为O(lgn)






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值