Priority Queue
普通队列是一种先进先出(FIFO)的数据结构。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高优先先出(first in,lagest out)的行为特征。
实现方案
使用排序和数组可以简单的实现Priority Queue,插入到列表的时间复杂度为𝑂(𝑛),排序列表的时间复杂度为𝑂(𝑛log𝑛)。更优的方式是使用大顶堆(小顶堆),以大顶堆(小顶堆)实现的Priority Queue的出队、入队时间复杂度均为𝑂(log 𝑛)。
二进制堆
1. 堆中某个节点的值总是不大于或不小于其父节点的值(分别为大顶堆和小顶堆)。
2. 堆是一颗完全二叉树。
从二叉树角度来看大顶堆:

以数组存储该大顶堆:

子节点与父节点的关系:
p_left = p * 2;
p_right = p * 2 + 1;
调整堆(出队、入队操作)
入队
- 新元素插在树的末尾,如果树的最后一层已满,添加一层。
- 如果插入元素打破大顶堆(小顶堆)的结构,与其父节点交换。
- 重复第二步直至满足大顶堆(小顶堆)的结构。
入队时间复杂度: 𝑂(log 𝑛)
出队
- 交换根节点元素与最后一个元素,删除根节点元素(现在是最后一个元素)。
- 如果交换后的根节点打破大顶堆的结构,与其较大的孩子节点交换。
- 重复第二部直至满足大顶堆结构。
出队时间复杂度:𝑂(log 𝑛)
堆调整的可视化演示
C语言实现
.h文件
1 | #include <stdio.h> |
.c文件
1 | #include "Priority_Queue.h" |
测试代码
1 | void testPriorityQueue(){ |
备注
由于堆调整是不稳定的,同优先级元素出队顺序是不定的,这里不允许插入同优先级元素。
如果对你有帮助的话,Star✨下一吧!