Cod sursa(job #498205)

Utilizator ChallengeMurtaza Alexandru Challenge Data 4 noiembrie 2010 15:37:05
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <fstream>

using namespace std;

const char InFile[]="algsort.in";
const char OutFile[]="algsort.out";
const int MaxN=500111;

ifstream fin(InFile);
ofstream fout(OutFile);

int n,v[MaxN],buffer[MaxN];

void merge_sort(int st, int sf)
{
	if(st<sf)
	{
		int mid1=st+(sf-st)/3;
		int mid2=mid1+(sf-st)/3;
		merge_sort(st,mid1);
		merge_sort(mid1+1,mid2);
		merge_sort(mid2+1,sf);
		int min1=st;
		int min2=mid1+1;
		int min3=mid2+1;
		int st2=st;
		--st;
		while(min1<=mid1 && min2<=mid2 && min3<=sf)
		{
			if(v[min1]<v[min2])
			{
				if(v[min1]<v[min3])
				{
					buffer[++st]=v[min1++];
				}
				else
				{
					buffer[++st]=v[min3++];
				}
			}
			else
			{
				if(v[min2]<v[min3])
				{
					buffer[++st]=v[min2++];
				}
				else
				{
					buffer[++st]=v[min3++];
				}
			}
		}
		while(min1<=mid1 && min2<=mid2)
		{
			if(v[min1]<v[min2])
			{
				buffer[++st]=v[min1++];
			}
			else
			{
				buffer[++st]=v[min2++];
			}
		}
		while(min2<=mid2 && min3<=sf)
		{
			if(v[min2]<v[min3])
			{
				buffer[++st]=v[min2++];
			}
			else
			{
				buffer[++st]=v[min3++];
			}
		}
		while(min3<=sf && min1<=mid1)
		{
			if(v[min3]<v[min1])
			{
				buffer[++st]=v[min3++];
			}
			else
			{
				buffer[++st]=v[min1++];
			}
		}
		while(min1<=mid1)
		{
			buffer[++st]=v[min1++];
		}
		while(min2<=mid2)
		{
			buffer[++st]=v[min2++];
		}
		while(min3<=sf)
		{
			buffer[++st]=v[min3++];
		}
		for(register int i=st2;i<=sf;++i)
		{
			v[i]=buffer[i];
		}
	}
}

int main()
{
	fin>>n;
	for(register int i=1;i<=n;++i)
	{
		fin>>v[i];
	}
	fin.close();

	merge_sort(1,n);

	for(register int i=1;i<=n;++i)
	{
		fout<<v[i]<<" ";
	}
	fout.close();
	return 0;
}