Cod sursa(job #852199)
#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 ;
}