优先队列总结

1.C++优先队列的使用示例

1.1 C++优先队列常规使用方法

头文件#include
声明如下:priority_queue, greater >

#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;
}

1.2自定义优先队列

自定义优先队列需要在结构体中重载比较符。用法如下:

#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;
}

2.C++优先队列的应用

杭电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;
}

3堆排序

那么优先队列如何实现的呢?
因此需要用到常用数据结构中的堆
下面代码实现了新建一个堆,并用堆排序的算法
将算法导论的伪代码转换为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;
}

4.优先队列的实现

优先级队列是一种维护由一组元素构成的集合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的原始关键字的值

你可能感兴趣的:(算法和数据结构)