Cod sursa(job #758114)

Utilizator BitOneSAlexandru BitOne Data 14 iunie 2012 15:24:29
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#include <cstdlib>
#include <iterator>
#include <algorithm>
#define N_MAX 500011

using namespace std;
int N;
int v[N_MAX], w[N_MAX];
inline void _swap( int& x, int& y ) { int aux=x; x=y; y=aux; }
inline void MegaSort( int left, int right )
{
	if( right == left )
		return;
	if( 1 == right-left )
	{
		if( v[right] < v[left] )
			_swap( v[right], v[left] );
		return;
	}
	int middle=(left+right)/2, xLeft, xMiddle, l=0;
	MegaSort( left, middle );
	MegaSort( middle+1, right );
	for( xLeft=left, xMiddle=middle+1; xLeft <= middle && xMiddle <= right; )
		if( v[xLeft] <= v[xMiddle] )
			w[++l]=v[xLeft], ++xLeft;
		else w[++l]=v[xMiddle], ++xMiddle;
	if( xLeft <= middle )
		for( ; xLeft <= middle; ++xLeft )
			w[++l]=v[xLeft];
	if( xMiddle <= right )
		for( ; xMiddle <= right; ++xMiddle )
			w[++l]=v[xMiddle];
	for( xLeft=left, xMiddle=1; xLeft <= right; ++xLeft, ++xMiddle )
		v[xLeft]=w[xMiddle];
}
int main( void )
{
	ifstream in( "algsort.in" );
	in>>N;
	copy( istream_iterator<int>(in), istream_iterator<int>(), v+1 );
	MegaSort( 1, N );
	ofstream out( "algsort.out" );
	copy( v+1, v+N+1, ostream_iterator<int>( out, " " ) );
	out<<'\n';
	return EXIT_SUCCESS;
}