• 堆排序实现优先队列


    因为写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
    ",min());
           for(i=1;i<=hlength;i++)
             printf("%d ",heap[i]);
           printf("
    ");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    android videoView 加载等待
    LocalBroadcastManager
    sessionStorage 、localStorage
    javascript 数组、json连接
    properties 文件注意事项
    nutz 使用beetl
    [Git/Github] ubuntu 14.0 下github 配置
    【UNIX环境编程、操作系统】孤儿进程和僵尸进程
    【操作系统】进程间通信
    【操作系统】线程
  • 原文地址:https://www.cnblogs.com/huzhenbo113/p/3233708.html
Copyright © 2020-2023  润新知