您的位置:首页 > 理论基础 > 数据结构算法

数据结构应用标准模版库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]中,依次类推。这样就做到了升序。下面是排序的代码



#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: