Pagini recente » Cod sursa (job #14077) | Cod sursa (job #3256535) | Cod sursa (job #1518416) | Cod sursa (job #2950266) | Cod sursa (job #1342377)
#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;
}