假如某个元素 x 比其父结点的元素值 p 更小,则其不满足最小堆的定义,需要调解。以 x 为研究对象,则应该将 x 与其父结点元素值 p 做交换,直到满足最小堆的定义为止。
以上操作从一棵树的角度来看,相当于将 x 向上调解了。下面是详细的算法步骤:
1 堆 h 是一个整型数组,长度为 n,需要调解的元素下标为 i,注意下标从 0 开始;
2 计算父结点下标,易知 i 的父结点下标 p 为 (i-1)/2 向下取整,假如 p >= 0 && h < h[p],则进行交换 swap(h, h[p]),然后将研究对象转移到父结点上:i = p,循环;否则退出循环,表示已经浮到顶了。其伪代码如下:
adjust_up(h, i):
if i < 0 or i >= h.length:
return
p = (i-1)/2
while p >= 0 && h[i] < h[p]:
swap(h[p], h[i])
i = p
p = (i-1)/2
复制代码
1.2.2 向下调解(下沉)
假如某个元素 a 比其父结点的元素值 p 更小,则其不满足最小堆的定义,需要调解。以其 父结点 p 为研究对象,则应该将 p 与其子结点元素值的最小值 x 做交换,直到满足最小堆的定义为止。
以上操作从一棵树的角度来看,相当于将 p 向下调解了。下面是详细的算法步骤:
1 堆 h 是一个整型数组,长度为 n,需要调解的元素下标为 i,注意下标从 0 开始;
2 计算左子结点下标,易知 i 的左子结点下标 l 为 i * 2 + 1,假如 i 还有右子结点,则应该比较左右子结点的值的巨细,取最小的谁人结点 c,然后进行交换 swap(h, h[c]),然后将研究对象转移到该子结点上:i = c,循环;否则退出循环,表示已经沉到底了。其伪代码如下: