堆排序实现优先队列

因为写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

 

 

 

posted @ 2013-08-02 22:11  执着追求的IT小小鸟  阅读(287)  评论(0编辑  收藏  举报