一、优先队列
优先队列是允许至少两种操作的数据结构:Insert(插入),DeleteMin(删除最小者)
简单的实现方式是使用二叉堆。
堆是一种非常实用的数据结构,其中以二叉堆最为常用。二叉堆可以看作一棵完全二叉树,每个节点的键值都大于(小于)其子节点,但左右孩子之间不需要有序。我们关心的通常只有堆顶的元素,而整个堆则被封装起来,保存在一个数组中。
下面分别介绍优先队列基本操作的实现
二、入队 (push)
基本实现步骤如下:
- 在下一个空闲处建立一个空穴
- 若空穴的父节点大于空穴的值,则将空穴向上行一步
流程图如下:
c 代码实现:
void Insert(int x, int *array, int num)
{
int i;
// i 表示空穴所在位置, i/2 表示空穴的父节点所在位置
// array[0] = 0 作为哨兵防止溢出
for (i = ++num; array[i/2] > x; i /= 2)
array[i] = array[i/2];
array[i] = x;
}
注意: 始终保持队列第一个元素为 0 是为了防止空穴上滤过程溢出
二、出队(pop)
需要考虑的是,由于堆现在少了一个元素,因此堆中最后一个元素 x 必须移动到该堆的某个地方。
基本实现步骤如下:
- 根处建立一个空穴(默认将最后一个元素放入空穴)
- 如果有比自己小的儿子,则将空穴的较小的儿子移入空穴
- 否则将最后一个元素放入空穴
流程图如下:
c 代码实现:
void DeleteMin(int *array, int *size)
{
int num = *size;
int lastVal = array[num--];
int child;
for (int i =