Cod sursa(job #460508)
#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 left, int middle, int right )
{
if( v[left] > v[middle] )
swap( v[left], v[middle] );
if( v[left] > v[right] )
swap( v[left], v[right] );
if( v[middle] > v[right] )
swap( v[middle], v[right] );
swap( v[middle], v[right-1] );
return v[right-1];
}
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( left, middle, right );
while( true )
{
while( lleft <= right && pValue > v[++lleft] );
while( rright >= left && 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 >= 1<<16 )
N>>=16, r+=16;
if( N >= 1<<8 )
N>>=8, r+=8;
if( N >= 1<<4 )
N>>=4, r+=4;
if( N >= 1<<2 )
N>>=2, r+=2;
if( N >= 1<<1 )
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, 2*Log2(N) );
ofstream out( "algsort.out" );
copy( v+1, v+N+1, ostream_iterator<int>(out, " " ) );
out<<'\n';
return EXIT_SUCCESS;
}