目录
一、定义
优先级队列本质是堆,缺省是是大顶堆(less<Type>)(operator<)。队列是从一头入另一头出,优先级队列可以自定义数据优先级,让优先级高的排前面。
priority_queue<Type,Contians,function> pq;
Type是数据类型,Contains是容器,一般默认是vector(也可以是其他用数组实现的容器)
不同于队列的是获取队头元素是top();
二、堆的实现
数组中下标为k的元素的父节点(假设存在的话)的下标为[k/2](向下取整),其子节点(假设子节点存在)的下标为2k和2k+1。
三、算法实现
插入操作
删除操作
部分代码
向下调整
void adjust_down(size_t parent)
{
size_t child = parent * 2 + 1;
while (child < _con.size())
{
if (child + 1 < _con.size() && _con[child] < _con[child + 1])
++child;
if (_con[child] > _con[parent])
{
swap(_con[child], _con[parent]);
parent = child;
child = 2 * parent + 1;
}
else
break;
}
}
向上调整
void adjust_up(size_t child)
{
size_t parent = (child - 1) / 2;
while (child > 0)
{
if (_con[child] > _con[parent])
{
swap(_con[child], _con[parent]);
child = parent;
parent = (child - 1) / 2;
}
else
break;
}
}