Cod sursa(job #1706469)

Utilizator AcuasPopescu Nicolae-Aurelian Acuas Data 22 mai 2016 17:26:01
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#define NMAX 500005
using namespace std;
ifstream f("algsort.in");
ofstream g("algsort.out");
int n,H[NMAX];
inline int father(int nod){
    return nod/2;
}
inline int leftSon(int nod){
    return 2*nod;
}
inline int rightSon(int nod){
    return 2*nod+1;
}
void sift(int n,int k,int H[]){
    int son;
    do{
        son=0;
        if(leftSon(k)<=n){
            son=leftSon(k);
            if(rightSon(k)<=n&&H[rightSon(k)]>H[son])
                son=rightSon(k);
            if(H[son]<=H[k])
                son=0;
        }
        if(son){
            swap(H[son],H[k]);
            k=son;
        }
    }while(son);
}
void percolate(int n,int k,int H[]){
    while(k>1&&H[father(k)]<H[k]){
        swap(H[father(k)],H[k]);
        k=father(k);
    }
}
void build_heap(int n,int H[]){
    for(int i=n/2;i>=1;i--)
        sift(n,i,H);
}
void heap_sort(int n,int H[]){
    build_heap(n,H);
    for(int i=n;i>=2;i--){
        swap(H[1],H[i]);
        sift(i-1,1,H);
    }
}
void citire(){
    f>>n;
    int i;
    for(i=1;i<=n;++i)
        f>>H[i];
}
void afisare(){
    int i;
    for(i=1;i<=n;i++)
        g<<H[i]<<' ';
}
int main(){
    citire();
    //afisare();
    heap_sort(n,H);
    afisare();
    return 0;
}