利用Vector实现优先级队列
Posted 小羊教你来编程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用Vector实现优先级队列相关的知识,希望对你有一定的参考价值。
优先级队列实现
目录:
一.什么是优先级队列?
优先级队列就是底层运用了堆的方式,在你输入一串数据以后,如果想要把内部的数据进行出栈的操作,内部会按照优先级的大小来输出,并不会按照你所输入的顺序进行输出 (默认是按照大堆的方式进行输出), 也就是默认按照先将最大的数进行输出,
二.原理的介绍
在这里原理的介绍我就只是简单的介绍其实现的原理,如果想看具体的思路步骤
点击此处看以前写过的堆排序的具体步骤
内部其实是就是通过堆先进行排序
然后每次输出一个数,先将堆头的数据和堆尾的数据进行交换,对堆尾进行删除,然后实现优先级出堆的方式.
三.代码实现
代码是通过Vector开辟的容器来进行实现的.
template<class T,class Container=vector<T>>
class PriorityQueue{ //优先级队列
private:
vector<T> v; //利用Vector实现
public:
void shiftUp(int child){ //这里就是实现子节点和父节点的对比,比较大小,从而实现与父节点的交换
int parent = (child - 1) / 2; //父节点对应的位置
//进行调整
while (child > 0){ //当子节点>0的时候
if (v[parent] < v[child]){ //和对应的父节点进行比较
swap(v[parent], v[child]); //满足则进行交换
child = parent;
parent = (child - 1) / 2; //交换对应的位置
}
else
break; //不满足条件,则存放在对应的位置,继续下一个数据的插入
}
}
void shiftDown(){ //当降序排序中出现了两个子节点都大于父节点的时候,怎样交换的实现
int parent = 0;
int child = 2 * parent + 1; //找到对应父子节点的位置
while (child < v.size()){
//从左右孩子中找到最大值
if (child+1 < v.size() && v[child] < v[child + 1]) //用最大的子节点和父节点进行交换
++child;
if (v[parent] < v[child]){ //看是否满足条件呢
swap(v[parent], v[child]); //满足则交换
parent = child;
child = 2 * parent + 1; //交换对应节点的位置
}
else
break; //不满足则跳出循环
}
}
void push(const T& val){ //插入数据的时候
v.push_back(val); //先从堆的底步进行插入
shiftUp(v.size() - 1); //然后进行升序处理,变为大堆(默认优先级队列为大堆)
}
void pop(){ //删除元素也是先默认删除最大的元素
swap(v[0], v[v.size() - 1]); //先将堆首和堆尾元素进行交换
v.pop_back(); //然后进行尾删处理
shiftDown(); //在将堆顶所在的最小值进行降序处理
}
T& top(){
return v[0];
//return v.front(); //直接取出容器的第一个元素就是优先级最大的元素
}
size_t size() const{
return v.size(); //直接调用Vector中的size()接口
}
bool empty() const{
return v.empty(); //调用判空接口
}
};
template <class T>
struct Greater{ //在类中进行声明,为大堆实现
bool operator()(const T& val1, const T& val2){
return val1 > val2;
}
};
template <class T>
struct Less{ //类中进行声明则为小堆
bool operator()(const T& val1, const T& val2){
return val1 < val2;
}
};
运行结果:
依次输入: 55 66 44 77 88 22 33 .
主要就是理解内部是按照堆的方式进行存储, 理解优先级含义
以上是关于利用Vector实现优先级队列的主要内容,如果未能解决你的问题,请参考以下文章