最小堆、向下调整
void siftdown(int i) { int flag=0,t; while(i*2<=n&&!flag) { if(h[[ii]>h[i*2]) t=i*2; else t=i; if(i*2+1<=n) { if(h[t]>h[i*2+1]) t=i*2+1; } if(t!=i) { swap(t,i); i=t; } else flag=1; } }
在最小堆中加入一个数,加在末尾然后向上调整
向上调整
void siftup(int i) { int flag=0; if(i==1) return ; while(i!=1&&!flag) { if(h[i]<h[i/2]) swap(i,i/2); else flag=1; i/=2; } }
建堆
int k=0; for(int i=1;i,=m;i++) { h[++k]=a[i]; siftup(k); }
删除顶部元素并输出
int deletemin() { int t=h[1]; h[1]=h[n--]; siftdown(1); return t; }