Pagini recente » Monitorul de evaluare | Cod sursa (job #1555428) | Cod sursa (job #544323) | Cod sursa (job #1886618) | Cod sursa (job #1435743)
#include <cstdio>
int n;
int a[500001],b[500001];
void swap(int i1,int i2)
{
int temp=a[i1];
a[i1]=a[i2];
a[i2]=temp;
}
void interclas(int i1,int i2,int i3,int i4)
{
int pos=1,temp=i1;
i2++;
i4++;
while(1)
{
if(i1==i2&&i3==i4) break;
if(i2==i1)
{
b[pos]=a[i3];
i3++;
pos++;
}
else if(i3==i4)
{
b[pos]=a[i1];
i1++;
pos++;
}
else if(a[i1]<a[i3])
{
b[pos]=a[i1];
i1++;
pos++;
}
else if(a[i3]<=a[i1])
{
b[pos]=a[i3];
i3++;
pos++;
}
}
for(int i=temp;i<i4;i++)
{
a[i]=b[i-temp+1];
}
}
void sort(int s,int e)
{
if(e-s+1>=3)
{
int mij=(s+e)/2;
sort(s,mij);
sort(mij+1,e);
interclas(s,mij,mij+1,e);
}
else
{
for(int i=s;i<e;i++)
{
for(int j=i+1;j<=e;j++) if(a[i]>a[j]) swap(i,j);
}
}
}
int main()
{
freopen ("algsort.in","r",stdin);
freopen ("algsort.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
sort(1,n);
for(int i=1;i<=n;i++) printf("%d ",a[i]);
}