调整堆 的过程,让某个节点为根的子树重新满足堆的性质。

在某些情况下,我们希望使用一个列表的所有元素来构建一个堆,有两种构建方式:

  • 用入堆操作建堆

    • 把一个空堆当起点,把数组里的元素一个一个放进去。

    • 每次放一个元素时,从底往上“调整”(堆化)。

    • 总共要放 个元素,每次调整最坏 ,所以总复杂度

  • 直接倒序堆化建堆

    • 先把所有元素直接放进数组里(不管堆规则)。

    • 从最后一个非叶子节点开始,依次往前,每个节点“从顶往下堆化”。

    • 因为叶子节点不用堆化,且底层节点数量最多、但高度很低,实际计算下来,整个过程的总复杂度是

若已有堆,有两种堆化方式:

  • 从底到顶堆化(sift up / percolate up)

    • 场景:插入新元素时。

    • 步骤:把新元素先放到堆的最后一个位置,然后不断和“父节点”比较、交换,直到满足堆的性质。

    • 方向:子节点 → 父节点。

    • 时间复杂度:(最多上升到根)。

  • 从顶到底堆化(sift down / percolate down)

    • 场景:删除堆顶元素、或建堆时。

    • 步骤:把“顶上的元素”往下放,不断和“左右子节点”比较、交换,直到满足堆的性质。

    • 方向:父节点 → 子节点。

    • 时间复杂度:(最多下降到叶子)。