优先队列是堆排序的一个具体应用。
优先队列分为如下几个操作:
1.INSERT(S,x)把元素x插入到优先队列中。
2.MAXIMUM(S):返回s中具有最大关键字的元素。
3.EXTRACT_MAX(S):去掉S中最大关键字的元素
4.INCREASE_KEY(S,x,k):将元素x的关键字值增加到k,k是不小于x的元素。
优先队列的应用:
1.共享计算机系统的作业调度。最大优先队列要i记录要执行的各个作业以及他们之间的相对优先级。当一个作业完成或者被中断后,调度器调用EXTRACT_MAX从所有的等待作业中,选出具有最高优先级的作业来执行。在任何时候调度器可以调用INSERT把一个新作业假如到队列中来。
2.可以用于最小生成树和单元最短路径优先算法中,需要应用DECREASE_KEY的应用。
代码:
/*
Author:Bai
Name:优先队列
Use for:1.共享计算机系统中的作业调度
2.基于事件驱动的模拟器
3.用在最小生成树和单元最短路径中
Date:2015/4/30
*/
#include<iostream>
using namespace std;
typedef struct heap
{
int heap_size;
int *key;
}heap;
void initialize(heap *A)
{
A->key=new int;
A->heap_size=0;
}
void MAX_HEAPIFY(heap *A,int i)//为了使堆保持大根堆的性质(我这里利用了循环操作的方法,而算法导论中应用了递归调用的办法)
{
//非递归方法
int largest;
int l=2*i;//l是A的左孩子
int r=2*i+1;//r是A的右孩子
if(l<=A->heap_size&&A->key[l]>A->key[i])//这里的大于号更改成小于号就是小根堆排序
largest=l;
else
largest=i;
if(r<=A->heap_size&&A->key[r]>A->key[largest])
largest=r;
while(largest!=i)
{
int temp=A->key[i];
A->key[i]=A->key[largest];
A->key[largest]=temp;
i=largest;