最小堆、向下调整

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;
    }
}
View Code

在最小堆中加入一个数,加在末尾然后向上调整

向上调整

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;
    }
}
View Code

建堆

int k=0;
for(int i=1;i,=m;i++) {
    h[++k]=a[i];
    siftup(k);
}
View Code

删除顶部元素并输出

int deletemin() { 
    int t=h[1];
    h[1]=h[n--];
    siftdown(1);
    return t;
}
View Code
原文地址:https://www.cnblogs.com/iwomeng/p/11560436.html