Cod sursa(job #728502)

Utilizator marta_diannaFII Filimon Marta Diana marta_dianna Data 28 martie 2012 19:23:00
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include<fstream>
#define NMAX 500010

using namespace std;

ifstream f("algsort.in");
ofstream g("algsort.out");

int a[NMAX], x[NMAX], y[NMAX], n;

void Citeste()
{
	int i;
	f>>n;
	for (i=1; i<=n; ++i) f>>a[i];
}

void Merge(int st, int dr)
{
	int mij=(st+dr)>>1, aux, i, j, k;
	
	if (dr-st+1>1)
		if (st-dr+1==2)
		{
			if (a[st]>a[dr]) aux=a[st], a[st]=a[dr], a[dr]=aux;
		}
		else
		{
			Merge (st, mij); 
			Merge (mij+1, dr);
			
			x[0]=mij-st+1;
			for (i=st; i<=mij; ++i) x[i-st+1]=a[i];
			
			y[0]=dr-mij;
			for (i=mij+1; i<=dr; ++i) y[i-mij]=a[i];
			i=1; j=1; k=0;
			while (i<=x[0] && j<=y[0])
				if (x[i]<y[j]) a[st+k]=x[i++], k++;
				else a[st+k]=y[j++], k++;
			while (i<=x[0]) a[st+k]=x[i++], k++;
			while (j<=y[0]) a[st+k]=y[j++], k++;
		} 
}

void Scrie()
{
	int i;
	g<<a[1];
	for (i=2; i<=n; ++i) g<<" "<<a[i];
	g<<"\n";
}

int main()
{
	Citeste();
	Merge(1, n);
	Scrie();
	f.close();
	g.close();
	return 0;
}