头文件#include
声明如下:priority_queue
#include
#include
using namespace std;
priority_queue<int, vector<int>, greater<int> >humble;
int main()
{
for(int i=5;i>0;i--)
{
humble.push(i);
}
while(!humble.empty())
{
cout<return 0;
}
自定义优先队列需要在结构体中重载比较符。用法如下:
#include
#include
using namespace std;
struct treenode{
int weight;
int value;
friend bool operator< (treenode a, treenode b)
{
return a.value < b.value;
}
};
priority_queue prique;
int main()
{
for (int i = 0; i < 4; i++)
{
treenode tempnode;
tempnode.value = 4-i;
tempnode.weight = i;
prique.push(tempnode);
}
cout<return 0;
}
杭电oj1058
http://acm.hdu.edu.cn/showproblem.php?pid=1058
题意:当一个数只有2、3、5、7这四种质因数时(也可以一种都没有或只有其中几种),这个数就是丑数,输出第 n 个丑数是多少;
解题思路:
首先生成丑数值小于2000000000的丑数数组:
设a[i]为存入第i个丑数的数组元素,pri_humble为递增的优先队列
(1)将1存入a[0];
(2)将2,3,5,7存入优先队列pri_humble中
(3)将优先队列中最小的值出队列存入数组的下一个元素(如a[1]=2)
(4)将这个最小的值分别乘以2,3,5,7加入到优先队列中
(5)重复(3)(4)步骤直到 2000000000
由于队列中会有重复数据,因此在出队列的时候判断与前一个数组元素是否相等,如果相等,继续下一个出队列
#include
#include
using namespace std;
priority_queue<long long, vector<long long>, greater<long long> >pri_humble;
long long a[5851];
int main()
{
long long n;
long long k=1;
a[0]=1;//1.将1存入a[0];
pri_humble.push(2);//2.将2,3,5,7存入优先队列pri_humble中
pri_humble.push(3);
pri_humble.push(5);
pri_humble.push(7);
while(k<5850)
{
if(pri_humble.top()==a[k-1])//相等继续下一个出队列
{
pri_humble.pop();
}else//不相等,执行(3)(4)操作
{
a[k]=pri_humble.top();
pri_humble.pop();
pri_humble.push(a[k]*2);
pri_humble.push(a[k]*3);
pri_humble.push(a[k]*5);
pri_humble.push(a[k]*7);
k++;
}
}
while(cin>>n&&n!=0)//按题目格式输出
{
cout<<"The "<if(n%10 == 1 && n%100 != 11) cout<<"st ";
else if(n%10 == 2 && n%100 != 12) cout<<"nd ";
else if(n%10 == 3 && n%100 != 13) cout<<"rd ";
else cout<<"th ";
cout<<"humble number is "<1]<return 0;
}
那么优先队列如何实现的呢?
因此需要用到常用数据结构中的堆
下面代码实现了新建一个堆,并用堆排序的算法
将算法导论的伪代码转换为c语言代码
#include
#include
/* a为数组,s表示a的元素下标,n表示要调整堆的个数,作用为使s为根的子树成为最大堆*/
int maxHeapify(int *a,int s,int n)
{
int largest=0;
int temp;
int left=s*2+1;
int right=left+1;
if(lefta[s])
{
largest=left;
}else{
largest=s;
}
if(righta[largest])
{
largest=right;
}
if(largest!=s)
{
temp=a[s];
a[s]=a[largest];
a[largest]=temp;
maxHeapify(a,largest,n);
}
return 0;
}
int heapSort(int *a,int n)
{
int i;
int temp;
//建堆
for(i=n/2-1;i>=0;i--)
{
maxHeapify(a,i,n);
}
//堆排序
for(i=n-1;i>0;i--)
{
temp=a[0];
a[0]=a[i];
a[i]=temp;
maxHeapify(a,0,i);
}
return 0;
}
int main()
{
int i;
int a[10]={14,16,3,4,7,2,8,9,1,10};
heapSort(a,10);
for(i=0;i<10;i++)
{
printf("%d\n",a[i]);
}
return 0;
}
优先级队列是一种维护由一组元素构成的集合S的数据结构,这一组元素中的每一个都有一个关键字key。一个最大优先级队列支持以下操作:
insert(S,x):把元素x插入集合S。这一操作可写为S=S ∪ {x};
maximum(S):返回S中具有最大关键字的元素;
extract-max(S):去掉并返回S中的具有最大关键字的元素;
increase-key(S,x,k):将元素x的关键字的值增加到k,这里k值不能小于x的原始关键字的值