建堆,先存入再调整
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 && 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 && 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 && l>r){
exchange(i,2*i);
down_adjust(2*i);
}
if(r>p && r>l){
exchange(i,2*i+1);
down_adjust(2*i+1);
}
}
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 && 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 && 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 && l>r){
exchange(i,2*i);
down_adjust(2*i);
}
if(r>p && r>l){
exchange(i,2*i+1);
down_adjust(2*i+1);
}
}
全部评论
相关推荐

点赞 评论 收藏
分享
02-22 20:28
重庆大学 Java 点赞 评论 收藏
分享