Pagini recente » Cod sursa (job #772238) | Cod sursa (job #728032) | Cod sursa (job #874549) | Cod sursa (job #492890) | Cod sursa (job #395566)
Cod sursa(job #395566)
#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;
}