Cod sursa(job #1184887)

Utilizator radu_cebotariRadu Cebotari radu_cebotari Data 14 mai 2014 13:44:49
Problema Sortare prin comparare Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include<fstream>
using namespace std;
ifstream in("algsort.in");
ofstream out("algsort.out");
typedef int heap[100000];
heap h;

inline int tata(int nod)
{
    return nod/2;
}

inline int fiu_st(int nod)
{
    return nod*2;
}

inline int fiu_dr(int nod)
{
    return nod*2+1;
}

inline int maxim()
{
    return h[1];
}

void sift(heap h,int n,int k)
{

    int son = 0;
    do{

        son = 0;
        if(fiu_st(k) <= n){
            son = fiu_st(k);
            if(fiu_dr(k) <= n && h[fiu_dr(k)] > h[fiu_st(k)])
                son = fiu_dr(k);
        if(h[son] <= h[k])
            son = 0;
        }

        if(son){
            swap(h[son],h[k]);
            k = son;
        }
    }while(son);
}

void percolate(heap h,int n,int k){

    int key = h[k];
    while((k > 1) && (key > h[tata(k)]))
    {

        h[k] = h[tata(k)];
        k = tata(k);
    }

    h[k] = key;
}

void build(heap h,int n)
{

    for(int i = n/2 ; i > 0 ; i--){
        sift(h,n,i);
    }
}

void del(heap h,int n,int k)
{

    h[k] = h[n];
    --n;
    if((k > 1) && (h[k] > h[tata(k)]))
       percolate(h,n,k);
    else
        sift(h,n,k);
}

void adauga(heap h,int n,int val)
{

    h[++n] = val;
    percolate(h,n,n);
}

void heap_sort(heap h,int n)
{
    build(h,n);

    for(int i = n ; i >= 2 ; --i){
        swap(h[1],h[i]);
        sift(h,i-1,1);
    }
}

int main()
{

    int n,i;
    in>>n;
    for(i = 1 ; i <= n ; i++)
        in>>h[i];
    heap_sort(h,n);
    for(i = 1 ; i <= n ; i++)
        out<<h[i]<<" ";
    return 0;
}