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