堆的建立的时间复杂度

本文探讨了两种堆排序的方法:自顶向下和自下向上。自顶向下插入可能导致堆不平衡,时间复杂度为n(logn-1)。自下向上则是从数组构建堆,逐层调整以满足堆性质,时间复杂度同样为o(n)。这两种方法在实际应用中各有优劣,适用于不同的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 自顶向下

一个结点一个结点的插入到堆的顶部,每次插入最多要进行h(树的已有高度)次调整,每一层结点数为2^h,那么每层总共时间复杂度通项为
k*2^k, k取0到h。h = logn(底数为2),所以对k从0-h层求积分(用分布积分,把底数2看成e)求得
nlogn - n = n(logn -1)
logn * n = o(nlogn).
其实上面这个是不对的,因为特殊的数据将导致堆不平衡,高度就不再是logn了,所以建议下面中各种方法。

2.自下向上

要排序的结点已经都存到数组里了,直接对数组进行调整使之成为堆

这里的自下向上的意思实际上是从子堆开始调整,子堆调整完成后就可以调整父堆了。每次调整子堆,也是每次把子堆自顶向下的进行调整,只不过不用插入

将数组下标看成对应树的结点编号。从有非叶节点的最高层那一层开始,由高层到低层逐层遍历结点的判断结点与左右儿子是否满足堆,不满足就交换o(1),并且递归判断其子树(因为交换后他们的的子树的根结点发生了变化,子树可能不再是堆)o(h-k)。然后一层结点判断完后就判断上一层。假设共h层,则第k层最多经历(h - k)次调整好它的左右子树,每层2^k个结点,所以每层总共时间通项为
2^k * (h-K);k从0 到h积分得到n - h -1;为o(n)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值