Cod sursa(job #1342377)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 13 februarie 2015 21:58:27
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define IN_FILE "algsort.in"
#define OUT_FILE "algsort.out"

#define father( a ) a >> 1
#define left_s( a ) a << 1
#define right_s( a ) ( a << 1 ) + 1
#define MAX_N  500005

int h[ MAX_N ];
inline void down_h( int *h, const int &N, int k ) {
    int fiu;
    do {
        fiu = 0;
        if( left_s( k ) <= N ) {
            fiu = left_s( k );
            if( right_s( k ) <= N && h[ right_s( k ) ] < h[ left_s( k ) ] )
                fiu = right_s( k );
        if( h[ fiu ] >= h[ k ] )
            fiu = 0;
        }
        if( fiu ) {
            swap( h[ k ], h[ fiu ] );
            k = fiu;
        }
    } while( fiu );
}
inline void up_h( int *h, const 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;
}
inline void build_h( int *h, const int &N ) {
    for( int i = N >> 1; i; --i )
        down_h( h, N, i );
}
inline void del_h( int *h, int &N, const int &k ) {
    h[ k ] = h[ N ];
    --N;
    if( k > 1 && h[ k ] < h[ father( k ) ] )
        up_h( h, N, k );
    else
        down_h( h, N, k );
}
inline void ins_h( int *h, int &N, const int &k ) {
    h[ ++N ] = k;
    up_h( h, N, N );
}
int main( ) {
    FILE *f;
    int N;

    f = fopen( IN_FILE, "r" );
    fscanf( f, "%d", &N );
    for( int i = 1; i <= N; ++i )
        fscanf( f, "%d", h + i );
    fclose( f );

    build_h( h, N );
    f = fopen( OUT_FILE, "w" );
    do {
        fprintf( f, "%d ", h[ 1 ] );
        del_h( h, N, 1 );
    } while( N );
    fclose( f );
    return 0;
}