堆(啊哈!算法)

1.最小生成树

#include<iostream>
using namespace std;
int h[101];
int n;
void swap(int a,int b){
    int t;
    t=h[a];
    h[a]=h[b];
    h[b]=t;
}
void siftdown(int i){
    int t,flag=0;
    while(i*2<=n && flag == 0){
        if(h[i]>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==0){
        if(h[i] <h[i/2]){
            swap(i,i/2);
        }else{
            flag=1;
        }
        i=i/2;
    }
}
void build(){
    for(int i=n/2;i>=1;i--){
        siftdown(i);
    }
}
int deletemax(){
    int t=0;
    t=h[1];
    h[1]=h[n];
    n--;
    siftdown(1);
    return t;
}
int main(){
    int i,num;
    cin>>num;
        n=num;
    for(int i=1;i<=num;i++){
        cin>>h[i];
    }
    build();
    for(i=1;i<=num;i++){
        if(i!=num){
            cout<<deletemax()<<' ';
        }else{
            cout<<deletemax()<<endl;
        }
    }
    return 0;
}

2.最大生成树

#include<iostream>
using namespace std;
int h[101],n;
void swap(int a,int b){
    int t;
    t=h[a];
    h[a]=h[b];
    h[b]=t;
} 
void shiftdown(int i){
    int t,flag=0;
    while(i*2<=n && flag == 0){
        if(h[i] < 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(i!=t){
            swap(t,i);
            i=t;
        }else{
            flag=1;
        }
    }
}
void creat(){
    int i;
    for(i=n/2;i>=1;i--){
        shiftdown(i);
    }
}
void heapsort(){
    while(n>1){
        swap(1,n);
        n--;
        shiftdown(1);
    }
}
int main(){
    int i,num;
    cin>>num;
    for(int i=1;i<=num;i++){
        cin>>h[i];
    }
    n=num;
    creat();
    heapsort();
    for(int i=1;i<=num;i++){
        if(i!=num){
            cout<<h[i]<<' ';
        }else{
            cout<<h[i]<<endl;
        }
    }
    return 0;
}

 以上2种都是优先队列

posted on 2020-04-17 16:44  二进制dd  阅读(148)  评论(0编辑  收藏  举报

导航