堆是一种特殊的数据结构,通常用于实现优先队列。堆是一个可以被看作近似完全二叉树的结构,并且具有一些特殊的性质,根据这些性质,堆被分为最大堆(或者大根堆,大顶堆)和最小堆两种。
因为堆是一棵完全二叉树若父节点的下标为i
,则左子节点下标为2i+1
,右子节点下标为2i+2
,这个规律会在算法排序中经常使用。
上滤(Percolate Up)
上滤是指在堆中插入
新元素后,通过一系列的比较和交换操作将该元素上移到合适的位置,以保持堆的堆序性。通常用于最小堆和最大堆中。
步骤:
下滤(Percolate Down)
下滤是指在删除
堆顶元素后,通过一系列的比较和交换操作将堆的最后一个元素(通常是堆底元素)移到堆顶,并将其下移到合适的位置,以保持堆的堆序性。
步骤:
堆化(Heapify)是指将一个无序的序列转换成一个堆,可以是最小堆或最大堆。堆化过程可以分为两种:自底向上堆化(Bottom-Up Heapify)和自顶向下堆化(Top-Down Heapify)。
自底向上堆化(Bottom-Up Heapify)
:自底向上堆化是从序列的最后一个非叶子节点开始,逐步向前处理每个节点,使得以该节点为根的子树成为一个堆。该方法保证了子树堆化后,整个序列也是一个堆。
步骤:
从序列的最后一个非叶子节点开始(通常是 n/2-1,其中 n 是序列的长度)。
对每个非叶子节点,与其子节点比较,如果不满足堆的性质,则进行交换。
重复上述步骤,直到处理完整个序列。
自顶向下堆化(Top-Down Heapify)
:自顶向下堆化是从序列的第一个元素开始,逐步向后处理每个节点,使得以该节点为根的子树成为一个堆。该方法保证了每个节点都满足堆的性质。
步骤:
从序列的第一个元素开始。
对每个节点,与其子节点比较,如果不满足堆的性质,则进行交换。
重复上述步骤,直到处理完整个序列。
应用场景: