您的位置:首页 > 其它

堆排序实现优先队列

2013-08-02 22:11 351 查看
因为写A*算法的需要,为了提高速度,顺手抄了个优先队列。。。。纯手搓

优先队列是0个或多个元素的集合,每个元素都有一个优先权或值,对优先队列执行的操作有1) 查找;2) 插入一个新元素;3) 删除.在最小优先队列(min priorityq u e u e)中,查找操作用来搜索优先权最小的元素,删除操作用来删除该元素;对于最大优先队列(max priority queue),查找操作用来搜索优先权最大的元素,删除操作用来删除该元素.优先权队列中的元素可以有相同的优先权,查找与删除操作可根据任意优先权进行.

我觉得关键在于:在堆排序的基础上,把建堆去掉就可以了,

插入的时候插在叶子结点处,然后向上调整,删除的时候删除掉根结点,然后向下调整

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int heap[400000],hlength;
void down(int p)//删除后向下调整
{
int a,q=p*2;
a=heap[p];//保存当前结点的值
while(q<=hlength)
{
if(q<hlength&&heap[q]>heap[q+1])//选择两个子结点中的一个最小的
q++;
if(heap[q]>=a)//如果子结点比当前结点大,就结束
break;
else {
heap[p]=heap[q];
p=q;q=p*2;
}
}
heap[p]=a;//还原原来的点
}
int min()
{
int r=heap[1];
heap[1]=heap[hlength--];
down(1);
return r;
}
void up(int p)//插入后向上调整
{
int q=p/2,a;//q是父节点
a=heap[p];
while(q>0&&a<heap[q])//
{
heap[p]=heap[q];//如果父节点结点比当前结点大就交换
p=q;q=p/2;
}
heap[p]=a;//还原原来的点
}
void insert(int a)
{
heap[++hlength]=a;
up(hlength);
}
int main()
{
int x,m,i;
hlength=0;
while(scanf("%d%d",&m,&x)!=EOF)
{
if(m==1)
insert(x);
else printf("之前输入最小的是%d\n",min());
for(i=1;i<=hlength;i++)
printf("%d ",heap[i]);
printf("\n");
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: