堆排序与平衡二叉搜索树详解
堆排序版本2分析
堆排序算法分为两个阶段。阶段二是当值处于堆中并逐个提取以形成有序列表。堆排序算法版本2的阶段二与版本1相同,复杂度为O(N log N)。
而版本2的阶段一与版本1不同,版本1是自上而下构建堆,版本2则是自下而上构建堆。新的阶段一复杂度为O(N),其中N是列表中的节点数。对于高度为h、包含(2^h - 1)个节点的完美二叉树,其最大比较路径长度之和为(2^h - 1 - h)。
考虑高度从1到h的二叉堆,每次调用 __siftDownFromTo 的最大路径长度如下表所示:
| 层级 | 最大路径长度 | 该层级节点数 |
| ---- | ---- | ---- |
| 1 | h - 1 | 1 |
| 2 | h - 2 | 2 |
| 3 | h - 3 | 4 |
| … | … | … |
| h - 2 | 2 | 2^(h - 3) |
| h - 1 | 1 | 2^(h - 2) |
| h | 0 | 2^(h - 1) |
我们可以通过计算最大路径长度之和S来确定阶段一的复杂度。
S = 1 * (h - 1) + 2 * (h - 2) + 2^2 * (h - 3) + … + 2^(h - 3) * 2 + 2^(h - 2) * 1
通过公式2S - S = S进行计算:
S = 2 * S - S = 2 * (h - 1) + 2^2 * (h - 2) + … + 2^(h - 2) * 2 + 2^(h - 1) * 1 - [
超级会员免费看
订阅专栏 解锁全文
16

被折叠的 条评论
为什么被折叠?



