Cod sursa(job #1254890)

Utilizator mihail.jianuJianu Mihail mihail.jianu Data 3 noiembrie 2014 18:02:45
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
/// heap sort cu heap iterativ, de mana
#include<cstdio>
const int N=500000;
const int INF=(1<<31)-1;
int min(int a,int b){
    if(a<b)
        return a;
    return b;
}
class MinHeap{
    public:
        int v[N+2];
        int l;
        void build(){
            l=0;
            for(int i=0;i<=N;i++)
                v[i]=INF;
        }
        bool empty(){
            return l==0;
        }
        int top(){
            return v[1];
        }
        void push(int x){
            v[++l]=x;
            int p=l;
            while(p>1&&v[p]<v[p/2]){
                change(p,p/2);
                p/=2;
            }
        }
        void pop(){
            v[1]=v[l--];
            v[l+1]=INF;
            int p=1;
            while(min(v[p*2],v[p*2+1])<v[p]&&p<=N/2)
                if(v[p*2]<v[p*2+1]){
                    change(p,p*2);
                    p*=2;
                }
                else{
                    change(p,p*2+1);
                    p=p*2+1;
                }
        }
    private:
        void change(int p1,int p2){
            int aux=v[p1];
            v[p1]=v[p2];
            v[p2]=aux;
        }
};
MinHeap h;
int n;
int main(){
    freopen("algsort.in","r",stdin);
    freopen("algsort.out","w",stdout);
    scanf("%d",&n);
    h.build();
    for(int i=1;i<=n;i++){
        int nr;
        scanf("%d",&nr);
        h.push(nr);
    }
    while(!h.empty()){
        printf("%d ",h.top());
        h.pop();
    }
    return 0;
}