Cod sursa(job #1546517)

Utilizator laurageorgescuLaura Georgescu laurageorgescu Data 8 decembrie 2015 09:59:55
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include<fstream>

using namespace std;

ifstream fin( "algsort.in" ); ofstream fout( "algsort.out" );

const int nmax = 500000;
int hn, h[ nmax + 1 ];

inline bool infata( int a, int b ) {
    return ( h[ a ] < h[ b ] );
}
inline void heap_swap( int a, int b ) {
    int aux = h[ a ]; h[ a ] = h[ b ]; h[ b ] = aux;
}
void urcare( int pos ) {
    while ( pos > 1 && infata( pos, (pos >> 1) ) ) {
        heap_swap( pos, (pos >> 1) );
        pos >>= 1;
    }
}
void coborare( int pos ) {
    bool ok = 1;
    while ( (pos << 1) <= hn && ok == 1 ) {
        int q = pos << 1;

        if ( q + 1 <= hn && infata( q + 1, q ) ) {
            ++ q;
        }

        if ( infata( q, pos ) ) {
            heap_swap( pos, q );
            pos = q;
        } else {
            ok = 0;
        }
    }
}
void heap_insert( int x ) {
    h[ ++ hn ] = x;
    urcare( hn );
}
void heap_erase() {
    heap_swap( 1, hn );
    -- hn;
    coborare( 1 );
}
int main() {
    int n, x;
    fin >> n;
    hn = 0;
    for( int i = 1; i <= n; ++ i ) {
        fin >> x;
        heap_insert( x );
    }
    for( int i = 1; i <= n; ++ i ) {
        fout << h[ 1 ] << " ";
        heap_erase();
    }
    fout << "\n";
    fin.close();
    fout.close();
    return 0;
}