Pagini recente » Cod sursa (job #1178550) | Cod sursa (job #99314) | Cod sursa (job #329754) | Cod sursa (job #1101169) | Cod sursa (job #395548)
Cod sursa(job #395548)
#include<fstream.h>
ifstream intrare("algsort.in");
ofstream iesire("algsort.out");
int v[500001],n;
void citire()
{
intrare>>n;
for(int i=1;i<=n;i++)
intrare>>v[i];
}
void swap(int &a,int &b)
{
int t=b;
b=a;
a=t;
}
int minim(int a, int b)
{
if(a>b) return b;
return a;
}
int mijloc(int a, int b)
{
int y;
y=(a+b)/2;
if(minim(a,b)==a)
return minim(y,b);
return minim(y,a);
}
void quicksort(int left,int right)
{
if(left<right)
{
int x=mijloc(left,right);
swap(v[right],v[x]);
int i=left,k=left,p=right;
while(i<p)
{
if(v[i]<v[right]) swap(v[i++],v[k++]);
else if(v[i]==v[right]) swap(v[i],v[--p]);
else i++;
}
int m=minim(p-k,right-p+1);
for(i=1;i<=m;i++)
swap(v[k+m-1],v[right-m+1]);
quicksort(left,k-1);
quicksort(right-p+k+1,right);
}
}
void afisare()
{
for(int i=1;i<=n;i++)
iesire<<v[i]<<" ";
}
int main()
{
citire();
quicksort(1,n);
afisare();
return 0;
}