优先级队列与堆相似,此处用小根堆模拟优先级队列。
当前最小的值存在x[1]。
insert 操作
void insert(T t) { int i,p; x[++n]=t;//把t插入到x[n] for(i=n;i>1&&x[p=i/2]>x[i];i=p)//如果父节点比子节点大 swap(x[p],x[i]);//交换两元素 }
查找并删除当前的最小值
T extractmin() { int i,c; T t=x[1]; x[1]=x[n--]//替换x[1]为x[n] for(i=1;(c=2*i)<=n;i=c) { if(c+1<=n&&x[c+1]<x[c])//比较左右孩子节点大小 c++;//如果右孩子节点比左孩子节点小 if(x[i]<=x[c]) break; swap(x[c];x[i]); } return t; }