数据结构 九 堆
堆的定义
heap,可以看作一棵树,只不过在性质方面和树不一样。
堆的性质
- 堆是一颗完全树。
- 堆的父结点值总是大于等于(最大堆)或者总是小于等于(最小堆)其孩子结点的值。
二叉堆
以最大堆为例
- 二叉堆满足堆的定义,二叉堆是一个完全二叉树。
- 当将一个数组看成一个堆的时候,若从零开始,则 2n+1 2n+2 为 n 的孩子。
二叉堆的算法
调整
堆的调整算法即将堆中一个子树进行调整,令其满足堆的定义。这种调整的方法如下。
- 若根的值小于孩子的值,则令其与较大的孩子进行交换
- 令交换后的结点作为新根重复1直到没有孩子或者比孩子的值要大。
新建一个堆,将一个无序的数组调整为一个堆,算法如下:
- 从最后一个非叶子结点向前遍历直到根节点
- 对每一个结点进行上述的调整算法。
若对一个已经成序的堆进行调整只需要调整一个改变的结点即可,因为此时只有要处理的结点无序,其余结点都有序。
插入
- 将插入到数据插入的二叉堆的最后面
- 将该结点的值和其父结点进行比较,若大于其父结点的值则与父结点交换,递归直到无法上浮。
堆的一个重要应用就是堆排序,即将一个数组看成一个堆,进行排序。
删除
- 使用数组最后一个结点覆盖要删除的结点完成删除
- 对该结点进行调整。
排序
使用堆排序,即将数组调整为最大堆之后将堆顶与堆尾元素互换,即将最大的元素放在数组尾部。调整堆。重复直到完成。
1 | //堆排序 |