数据结构应用标准模版库STL——优先级队列(优先级队列排序)
2013-11-22 18:35
357 查看
优先级队列的抽象模型并不把数据存储结构看成是顺序容器。元素在进入优先级队列时,没有任何限制,但在退出时却有一个标准。我们可以把优先级队列想象成数据元素的集合,元素就像被随便丢到垃圾桶一样,彼此没有什么联系。联系数据时像把手伸到桶里,挑一个优先级最大的出来。
优先级队列ADT的接口与栈,队列容器几乎相同。但是,为了确定优先级的大小,数据类型T必须实现关系运算符<。push()操作像优先级队列中添加一个数据,pop()操作删除优先级最高的数据。与其他容器一样,我们也可以通过size()和empty()函数来访问优先级最高的状态。特别是,我们应当注意优先级队列是怎样引用下一个将要弹出的数据的。与栈相同的是,优先级队列使用top()操作,与此相反,队列是通过front()操作来实现的。 priority_queue类在头文件queue中。
默认情况下,优先级队列假定凡具有最大值的元素也具有最大的优先级。就是说,如果x和y是优先级队列中的元素,并且x<y,那么y比x有更大的优先级。
堆是一种特殊的二叉树,用堆来实现优先级队列是非常高效的。STL priority_queue类是通过使用堆来实现优先级队列的。
优先级队列提供了一种很有效的排序算法。该算法首先把向量v的n=v.size()个元素加入到一个优先级队列中,然后通过一个循环从优先级队列中把数据一个一个蹦出来。
因为优先级队列在释放数据时是按照倒序进行的(由最大优先级到最小优先级),所以排序过程中,把优先级队列弹出的第1个元素存入v[n-1]中,第2个元素存如v[n-2]中,依次类推。这样就做到了升序。下面是排序的代码
优先级队列ADT的接口与栈,队列容器几乎相同。但是,为了确定优先级的大小,数据类型T必须实现关系运算符<。push()操作像优先级队列中添加一个数据,pop()操作删除优先级最高的数据。与其他容器一样,我们也可以通过size()和empty()函数来访问优先级最高的状态。特别是,我们应当注意优先级队列是怎样引用下一个将要弹出的数据的。与栈相同的是,优先级队列使用top()操作,与此相反,队列是通过front()操作来实现的。 priority_queue类在头文件queue中。
默认情况下,优先级队列假定凡具有最大值的元素也具有最大的优先级。就是说,如果x和y是优先级队列中的元素,并且x<y,那么y比x有更大的优先级。
堆是一种特殊的二叉树,用堆来实现优先级队列是非常高效的。STL priority_queue类是通过使用堆来实现优先级队列的。
优先级队列提供了一种很有效的排序算法。该算法首先把向量v的n=v.size()个元素加入到一个优先级队列中,然后通过一个循环从优先级队列中把数据一个一个蹦出来。
因为优先级队列在释放数据时是按照倒序进行的(由最大优先级到最小优先级),所以排序过程中,把优先级队列弹出的第1个元素存入v[n-1]中,第2个元素存如v[n-2]中,依次类推。这样就做到了升序。下面是排序的代码
#include<iostream> #include<queue>//为了使用priority_queue #include<vector> //为了使用vector using namespace std; template <typename T> void writevector(const vector<T>&v)//输出函数仅需要一个常量引用向量参数 { int i,n=v.size();//在n中捕获向量大小 for(i=0;i<n;i++) cout<<v[i]<<" "; cout<<endl; } template<typename T>//利用优先级队列模版<typename T>对v排序 void psort(vector<T>&v)//函数psort()实现了这种类属类型T的排序算法,类属类型T必须支持关系运算符<. { priority_queue<T> p; int i,n=v.size(); for(i=0;i<n;i++) p.push(v[i]);//把向量v的元素插入到优先级队列中 for(i=n-1;i>=0;i--) { v[i]=p.top(); //从优先级队列中删除元素,并把它们复制回向量v p.pop(); } } int main() { int arr[]={16,18,20,48,50,64,35,77,23}; int arrsize=sizeof(arr)/sizeof(int); vector<int > v(arr,arr+arrsize); //用数组初始化向量 cout<<"Initial vector : "; writevector(v); psort(v); cout<<"Sorted vector : "; writevector(v); return 0; }
相关文章推荐
- 平衡二叉排序树 - 数据结构和算法76
- 数据结构学习笔记3——单链表
- 数据结构第二章总结
- 数据结构实验:图的操作
- 【算法】A*算法,数据结构小作业
- 数据结构应用标准模版库STL——队列的基本操作
- 数据结构之顺序结构线性表之操作
- 数据结构应用标准模版库STL——栈(分解栈元素)
- 数据结构应用标准模版库STL——栈(进制转换)
- 唐老师数据结构专题八3
- 经典数据结构之二维矩阵的基本运算
- 数据结构简介
- 数据结构二叉树的java实现,包括二叉树的创建、搜索、删除和遍历
- 数据结构队列的java实现,包括线性和链式两种方式
- 数据结构栈的java实现
- Prim算法的实现
- 唐老师数据结构专题八2
- 地铁出站顺序问题(栈的输出顺序)
- 数据结构与算法分析学习笔记之一-链表
- 唐老师数据结构专题八1