Heap
最后更新于:2022-04-02 01:06:29
# Heap - 堆
一般情况下,堆通常指的是**二叉堆**,**二叉堆**是一个近似**完全二叉树**的数据结构,**即披着二叉树羊皮的数组,**故使用数组来实现较为便利。子结点的键值或索引总是小于(或者大于)它的父节点,且每个节点的左右子树又是一个**二叉堆**(大根堆或者小根堆)。根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。**常被用作实现优先队列。**
### 特点
1. **以数组表示,但是以完全二叉树的方式理解**。
1. 唯一能够同时最优地利用空间和时间的方法——最坏情况下也能保证使用 2NlogN2N \log N2NlogN 次比较和恒定的额外空间。
1. 在索引从0开始的数组中:
- 父节点 `i` 的左子节点在位置`(2*i+1)`
- 父节点 `i` 的右子节点在位置`(2*i+2)`
- 子节点 `i` 的父节点在位置`floor((i-1)/2)`
### 堆的基本操作
以大根堆为例,堆的常用操作如下。
1. 最大堆调整(Max_Heapify):将堆的末端子节点作调整,使得子节点永远小于父节点
1. 创建最大堆(Build_Max_Heap):将堆所有数据重新排序
1. 堆排序(HeapSort):移除位在第一个数据的根节点,并做最大堆调整的递归运算
其中步骤1是给步骤2和3用的。
![Heapsort-example](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-10-24_562b1f30420b8.gif)
';