建堆,先存入再调整

const int N=1e5+6;
int pile[N],data[N];
int idx=1,n;
for(int i=1;i<=n;i++){     // 存入
    pile[idx]=data[i], idx++;
}
int ind=idx-1;
while(2*ind>=idx) ind--;       // 找到最后一个非叶子节点的下标

void down_adjust(int pa){
    if(2*pa<idx &amp;&amp; 2*pa+1<idx){
        if(pile[2*pa]>pile[2*pa+1]){
            if(pile[2*pa]>pile[pa]){
                exchange(pa,2*pa);
                down_adjust(2*pa);
            }
        }
        else{
            if(pile[2*pa+1]>pile[pa]){
                exchange(pa,2*pa+1);
                down_adjust(2*pa+1);
            }
        }
    }
    if(2*pa<idx &amp;&amp; 2*pa+1>=idx){
        if(pile[2*pa]>pile[pa]){
            exchange(pa,2*pa);
            down_adjust(2*pa);
        }
    }
}
// 遍历调整
for(int i=ind;i>=1;i--){
    int p=pile[i],l,r;
    if(2*i+1<idx) l=pile[2*i], r=pile[2*i+1];
    else l=pile[2*i], r=pile[i]-1;
    if(l>p &amp;&amp; l>r){
        exchange(i,2*i);
        down_adjust(2*i);
    }
    if(r>p &amp;&amp; r>l){
        exchange(i,2*i+1);
        down_adjust(2*i+1);
    }
}
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务