Cod sursa(job #395566)

Utilizator lucianvnDragomir Lucian lucianvn Data 13 februarie 2010 14:30:35
Problema Sortare prin comparare Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include<fstream.h>
ifstream intrare("algsort.in");
ofstream iesire("algsort.out");
long unsigned n,v[500002];
void citire()
{
	intrare>>n;
	for(int i=1;i<=n;i++)
		intrare>>v[i];
	intrare.close();
}
int minim(int a, int b)
{
	if(a>b) return b;
	return a;
}
int mijlociu(int a, int b)
{
	int t=(a+b)/2;
	if(minim(v[a],v[b])==v[a])
		{if(minim(v[b],v[t])==v[b]) return b;
		else return t;}
	else 
	{
		if(minim(v[a],v[t])==v[a]) return a;
		else return t;
	}
}
void swap(int a, int b)
{
	int t=v[a];
	v[a]=v[b];
	v[b]=t;
}
void quicksort(int left, int right)
{
	if(left<right)
	{
		int x=mijlociu(left,right);
		swap(right,x);
		int i=left,k=left,p=right;
		while(i<p)
		{
			if(v[right]>v[i]) swap(k++,i++);
			else if(v[right]==v[i]) swap(--p,i);
			else i++;
		}
		int m=minim(p-k,right-p+1);
		for(i=1;i<=m;i++)
			swap(k+i-1,right-i+1);
		quicksort(left,k-1);
		quicksort(right-p+k+1,right);
	}
}
void afisare()
{
	for(unsigned i=1;i<=n;i++)
		iesire<<v[i]<<" ";
	iesire.close();
}
int main()
{
	citire();
	quicksort(1,n);
	afisare();
	return 0;
}