Cod sursa(job #852199)

Utilizator bogdan93Grigorescu Bogdan bogdan93 Data 10 ianuarie 2013 23:42:58
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <cstdio>
#include <cstdlib>

#define nmax 500001

int heap [ nmax ] , N , heap_nr ;

void swap ( int &a , int &b )
{
    int aux = a;
    a = b ;
    b = aux;
}

void upheap ( int k )
{
    if ( k / 2 >= 1 )
        if ( heap [ k ] > heap [ k / 2 ] )
            {
                swap ( heap [ k ] , heap [ k / 2 ] ) ;
                upheap ( k / 2 ) ;
            }
}
void downheap ( int k )
{
    if ( 2 * k <= heap_nr )
        {
            int max = 2 * k ;
            if ( 2 * k + 1 <= heap_nr && heap [ 2 * k + 1 ] > heap [ 2 * k ] )
                max = 2 * k + 1 ;
            if ( heap [ k ] < heap [ max ] )
                {
                    swap ( heap [ k ] , heap [ max ] ) ;
                    downheap ( max ) ;
                }
        }
}

int main ()
{
    FILE *fin , *fout ;
    fin = fopen ( "algsort.in" , "rt" ) ;
    fout = fopen ( "algsort.out" , "wt" ) ;

    fscanf ( fin , "%d" , &N ) ;

    for ( int i = 1 ; i <= N ; i++ )
    {
        int b ;
        fscanf ( fin , "%d" , &b ) ;
        heap_nr++ ;
        heap [ heap_nr ] = b ;
        upheap ( heap_nr ) ;
    }

    for ( int i = 1 ; i <= N ; i++ )
    {
        swap ( heap [ 1 ] , heap [ heap_nr ] ) ;
        heap_nr-- ;
        downheap ( 1 ) ;
    }

    for ( int i = 1 ; i <= N ; i++ )
        fprintf ( fout , "%d " , heap[i] ) ;
    fclose ( fin ) ;
    fclose ( fout ) ;

    return 0 ;
}