优先队列
普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。通常采用堆数据结构来实现。
本文章详解优先队列的最基本实现:二叉堆,及其相关操作
正文
由于二叉堆的使用过于普遍,我们会直接称“二叉堆”为“堆”。
-
堆的结构性质
堆是一棵完全二叉树
容易证明,一棵高为h的完全二叉树有2h到2h+1-1个节点,那么完全二叉树的高是 ⌊log n⌋,显然它是O(log N)。
由于完全二叉树很有规律,所以它可以用数组表示而并非指针。对于数组中的任意位置i,该节点的左儿子在2i上,右儿子在2i+1上(如果它有的话)。 -
声明
typedef struct HeapStruct
{
int capacity; //最大容量
int size; //当前堆的大小(体现为数组使用了多少)
int *elements; //数组
} *PriorityQueue;
- 堆序性质
使操作被快速执行的性质是堆序&