首页 > 编程语言 > 详细

堆(啊哈!算法)

时间:2020-04-17 17:27:13      阅读:58      评论:0      收藏:0      [点我收藏+]

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种都是优先队列

堆(啊哈!算法)

原文:https://www.cnblogs.com/jcahsy/p/12720928.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!