📜  heapify down (1)

📅  最后修改于: 2023-12-03 14:41:42.625000             🧑  作者: Mango

Heapify Down

在二叉堆(Binary Heap)数据结构中,Heapify Down 是用于维护堆性质(Heap Property)的操作之一。它的目的是把某个节点及其子节点中的最大(或最小)元素下沉到它的正确位置,以保持堆的特性不变。

堆的性质

堆是一种特殊的完全二叉树(Complete Binary Tree),它可以分为两种类型:最大堆(Max Heap)和最小堆(Min Heap)。不管是最大堆还是最小堆,堆都具有以下性质:

  1. 结构性质:堆是一个完全二叉树,除了最后一层,所有层都是满的,最后一层从左到右填满,不会留下洞。
  2. 堆序性质:每个节点都大于/小于其子节点。最大堆中,父节点的值不小于任何一个子节点的值;最小堆中,父节点的值不大于任何一个子节点的值。
操作过程

在 Heapify Down 过程中,我们会从某个节点开始,判断其是否与其子节点中的最大(或最小)元素满足堆序性质。如果不满足,则将该节点与其子节点中的最大(或最小)元素交换位置,并继续 Heapify Down 直到满足堆序性质为止。

Heapify Down 的实现过程主要分为两步:

  1. 找到该节点及其子节点中的最大(或最小)元素。
  2. 若该节点不满足堆序性质,则交换它与子节点中的最大(或最小)元素,并继续 Heapify Down。
代码实现

以下是最大堆 Heapify Down 的实现代码(使用 Java 语言实现):

void heapifyDown(int i) {
    int leftChild = 2 * i + 1;
    int rightChild = 2 * i + 2;
    int largest = i;
    
    if (leftChild < size() && array[leftChild] > array[largest]) {
        largest = leftChild;
    }
    
    if (rightChild < size() && array[rightChild] > array[largest]) {
        largest = rightChild;
    }
    
    if (largest != i) {
        swap(i, largest);
        heapifyDown(largest);
    }
}

在上述代码中,array 是存储堆元素的数组,size() 返回堆中元素的个数(即数组长度),swap(i, j) 是交换数组下标为 ij 的元素的方法。

这里我们使用了递归的方式来实现 Heapify Down,如果当前节点不满足堆序性质,则交换该节点与子节点中的最大元素,然后递归调用下一个节点,继续调用 Heapify Down。

总结

Heapify Down 是一种维护堆性质的重要操作,它可以用于堆的构建、堆排序、堆的删除等场景。堆是一种非常重要的数据结构,它的实现涉及到许多算法知识,包括二叉树、递归、排序等。需要掌握好堆的基本原理和实现方式,才能更好地应用堆来解决各种问题。