Cod sursa(job #1757456)

Utilizator AcuasPopescu Nicolae-Aurelian Acuas Data 15 septembrie 2016 08:30:33
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
//HEAPSORT
#include <fstream>
#define NMAX 500100
using namespace std;
ifstream f("algsort.in");
ofstream g("algsort.out");
typedef int HEAP[NMAX];
HEAP H;
int n;
void citire(){
    f>>n;
    int i;
    for(i=1;i<=n;i++){
        f>>H[i];
    }
}
inline int father(int k){
    return k/2;
}
inline int left_son(int k){
    return 2*k;
}
inline int right_son(int k){
    return 2*k+1;
}
void sift(int n,int k){
    int son;
    do{
        son=0;
        if(left_son(k)<=n){
            son=left_son(k);
            if(right_son(k)<=n&&H[son]<H[right_son(k)])
                son=right_son(k);
            if(H[son]<=H[k])
               son=0;
        }
        if(son){
            swap(H[son],H[k]);
            k=son;
        }
    }while(son);
}
void perculate(int n,int k){
    int key=H[k];
    while((k>1)&&key>H[father(k)]){
        H[k]=H[father(k)];
        k=father(k);
    }
    H[k]=key;
}
void build_heap(int n,HEAP H){
    int i;
    for(i=n/2;i>=1;i--){
        sift(n,i);
    }
}
void heapsort(int n,HEAP H){
    int i;
    for(i=n;i>=2;i--){
        swap(H[i],H[1]);
        sift(i-1,1);
    }
}
void afisare(int n,HEAP H){
    int i;
    for(i=1;i<=n;i++)
        g<<H[i]<<' ';
}
int main(){
    citire();
    build_heap(n,H);

    heapsort(n,H);
    afisare(n,H);
    return 0;
}