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 提供了 时间的构建方法。

参见