优先队列
普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (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;
- 堆序性质
使操作被快速执行的性质是堆序(heap order)性。这正是文章开头给出优先队列的概念中实现“优先级”的部分。
如果较小的元素优先级更高,那么我们称这个堆叫做最小值堆(min heap),也叫小根堆。反之叫最大值堆(max heap)。这篇文章讲述最小值堆。
具体来说,在堆中,对于每一个节点X,X的父亲的数据(