堆:一种特殊的完全二叉树结构
(1)大跟堆:一颗完全二叉树,满足任一节点都比其孩子节点大。
(2)小根堆:一种完全二叉树,满足任一节点都比其孩子节点小。
堆的向下调整:当根节点的左右子树都是堆时,可以通过一次向下的调整来将其变换成另一个堆。
咱们来看一个例子:
现在要求将这个树变化为大根堆(满足任一节点都比其孩子节点大),咱们可以发现最上面的2要比其孩子节点7,9都小,那么将两个孩子节点中最大的替换道到2的位置才能一步步构成大根堆,那么变换后:
这时我们发现如果把2放在9的位置还是不能构成大根堆,因为2比8,5都要小,所以要将8放到原来9的位置,现在2的位置变换为:
同理我们可以看到此时2和6,4比还是小,所以取6,4中大的数6,放到原来8的位置现在2的位置,变换为:
至此我们发现已经满足大根堆的要求,说明我们经过变换,将这个树变换为大根堆。
了解堆的向下调整之后,咱们就可以来看看
堆的排序过程:
1.建立堆。
2.得到堆顶元素,为最大元素。
3.去掉堆顶,将堆的最后一个元素放到堆顶,此时可以通过一次调整(向下调整)重新使堆有序。
4.堆顶元素为第二大元素。
5.重复步骤三直到堆变空。
咱们利用上面的例子解释一下这个过程:
9在堆顶此时是堆的最大元素,将9取出:
再将这个堆最后一个元素放到堆顶
之后通过堆的向下的调整(上面讲的)重新使堆有序
经过变换又变成一个大根堆,重复步骤三,将此时堆顶的8取出,再将堆的最后一个元素3,放在堆顶,再进行堆的向下调整…以此进行直到堆变空。
好接下来咱们看下,向下调整的代码:
主体函数:
理解容易代码难写,大家有不明白的地方私信我。