Cod sursa(job #460507)
#include <cstdlib>
#include <fstream>
#include <iterator>
#define Nmax 500111
/*
*
*/
using namespace std;
int v[Nmax];
inline void DownHeap( int k, int N )
{
for( int son=2*k; son <= N; k=son, son*=2 )
{
if( son < N && v[son+1] > v[son] )
++son;
if( v[k] >= v[son] )
return;
swap( v[k], v[son] );
}
}
inline void HeapSort( int start, int end )
{
for( int i=start+(end-start)/2; i >= start; --i )
DownHeap( i, end );
while( end >= start )
{
swap( v[start], v[end] );
--end;
DownHeap( start, end );
}
}
inline int MedianOf3( int x, int y, int z )
{
if( x >= y )
{
if( y >= z )
return y;
else if( z >= x )
return x;
return z;
}
else if( y >= z )
{
if( x >= z )
return x;
else return z;
}
return y;
}
inline void IntroSort( int left, int right, int depth_limit )
{
if( left < right )
{
if( !depth_limit )
{
HeapSort( left, right );
return;
}
int middle=left+(right-left)/2, lleft=left-1, rright=right+1, pValue=MedianOf3( v[left], v[middle], v[right] );
while( true )
{
while( lleft <= right && pValue > v[++lleft] );
while( rright > 0 && pValue < v[--rright] );
if( lleft > rright )
break;
swap( v[lleft], v[rright] );
}
if( lleft < right )
IntroSort( lleft, right, depth_limit-1 );
if( rright > left )
IntroSort( left, rright, depth_limit-1 );
}
}
inline int Log2( int N )
{
if( N <= 0 )
return -1;
int r=0;
if( N >= 65536 )
N>>=16, r+=16;
if( N >= 256 )
N>>=8, r+=8;
if( N >= 16 )
N>>=4, r+=4;
if( N >= 4 )
N>>=2, r+=2;
if( N >= 2 )
r+=1;
return r;
}
int main( void )
{
int N;
ifstream in( "algsort.in" );
in>>N;
copy( istream_iterator<int>(in), istream_iterator<int>(), v+1 );
IntroSort( 1, N, 4*Log2(N) );
ofstream out( "algsort.out" );
copy( v+1, v+N+1, ostream_iterator<int>(out, " " ) );
out<<'\n';
return EXIT_SUCCESS;
}