Pagini recente » Cod sursa (job #2916803) | Cod sursa (job #2122878) | Cod sursa (job #70159) | Cod sursa (job #2974395) | Cod sursa (job #2739274)
#include <bits/stdc++.h>
using namespace std;
ifstream fin( "algsort.in" );
ofstream fout( "algsort.out" );
const long long INF = 2000000000001;
int N;
int v[500005];
void Heapify( int idx ) {
if( idx * 2 <= N ) Heapify( idx * 2 );
if( idx * 2 + 1 <= N ) Heapify( idx * 2 + 1 );
long long val1, val2;
/// get values of both child nodes
if( idx * 2 > N ) val1 = INF;
else val1 = v[2 * idx];
if( idx * 2 + 1 > N ) val2 = INF;
else val2 = v[2 * idx + 1];
/// if the nodes are in the right place return
if( min( val1, val2 ) >= v[idx] ) return;
if( val1 < val2 ) {
swap( v[idx], v[idx * 2] );
Heapify( idx * 2 );
}
else {
swap( v[idx], v[idx * 2 + 1] );
Heapify( idx * 2 + 1 );
}
}
void downheap( int idx ) {
long long val1, val2;
if( idx * 2 > N ) val1 = INF;
else val1 = v[2 * idx];
if( idx * 2 + 1 > N ) val2 = INF;
else val2 = v[2 * idx + 1];
if( min( val1, val2 ) >= v[idx] ) return;
if( val1 < val2 ) {
swap( v[idx], v[idx * 2] );
downheap( idx * 2 );
}
else {
swap( v[idx], v[idx * 2 + 1] );
downheap( idx * 2 + 1 );
}
}
int heap_pop() {
swap( v[1], v[N] );
--N;
downheap( 1 );
}
int main()
{
fin >> N;
for( int i = 1; i <= N; ++i )
fin >> v[i];
/*Heapify( 1 );
//for( int i = 1; i <= N; ++i )
// fout << v[i] << ' ';
*/
for( int i = N; i > 0; --i )
downheap( i );
while( N ) {
fout << v[1] << ' ';
heap_pop();
}
return 0;
}