BUILD-MAX-HEAP
概述
BUILD-MAX-HEAP 将一个无序的输入数组转化为一个满足最大堆性质的 二叉堆,采用自底向上的策略,对每个非叶节点调用 MAX-HEAPIFY。
定义
BUILD-MAX-HEAP(A)
输入:数组 。
过程:
从最后一个非叶节点 开始,自底向上逐个调用 MAX-HEAPIFY,最终将整个数组转化为最大堆。
时间复杂度:。
核心性质
时间复杂度为 而非
一个常见的错误直觉是:有 个非叶节点,每个调用 MAX-HEAPIFY 耗时 ,因此总时间为 。然而这一上界并不紧确。
精确分析:对于高度为 的节点,MAX-HEAPIFY 的运行时间为 。堆中高度为 的节点最多有 个。因此总时间为:
其中利用了 (一个收敛的等比级数)。
为什么自底向上?
从底层开始处理的原因是:MAX-HEAPIFY 的前提是子树已经是最大堆。自底向上保证了在处理节点 时,其左右子树已经被处理过,满足调用前提。
Floyd 建堆法
该算法由 Robert W. Floyd 于 1964 年提出,也称为 Floyd 建堆法(Floyd’s heap construction),是线性时间建堆的经典方法。
章节扩展
第6章:堆排序
BUILD-MAX-HEAP 是 堆排序 的第一步。建堆完成后,排序算法通过反复交换堆顶与末尾元素并缩小堆规模来完成排序。
第6章:优先队列
如果需要从一个无序数组快速构建优先队列,BUILD-MAX-HEAP 提供了 时间的构建方法。