1.简介
堆是什么?堆是一种特殊的完全二叉树,就像下面这棵树一样:
这棵树有一个很显著的特点,那就是所有父结点都要比子结点要小。符合这样要求的完全二叉树我们成为“最小堆”。反之,如果所有父结点都要比子结点大,这样的完全二叉树被称为”最大堆“。
2.下移ShiftDown
如果我们现在要删除掉最小的数字,并重新插入一个数字,再从中找出最小的数字。目前只能够先扫描所有的数字,找到最小的数,插入新的数字后再扫描所有的数字。这样子的时间复杂复是O(N²),那么有没有更好的方法呢?”堆“的结构恰好能够很好地解决了这个问题。
首先将数字按照最小堆的要求放进一颗完全二叉树,就像下面这棵树一样。然后用数组h存储这些数字。
很显然最小的数就在堆顶,假设存储这个堆的数组是h,那么最小的数字就是h[1]。接下来将堆顶的数字删除。将新增的数字28放入堆顶。此时显然不满足小顶堆的特性,我们需要将新增的数字调整到合适的位置。如何调整呢?
向下调整!我们需要将这个数字与它的两个儿子2和5比较,选择较小的一个和它交换,交换之后如下:
我们发现此时还是不符合最小堆的特性,因此还需要继续向下调整。于是继续将28与两个儿子12和7比较,选择较小的一个进行交换
此时还是不满足,继续向下调整:
现在我们已经找到符合最小堆的特性了。综上所述,当新增加一个数被放到顶堆时候,如果发现不符合最小堆的特性ÿ