Pagini recente » Cod sursa (job #256280) | Cod sursa (job #1900149) | Cod sursa (job #1525056) | Cod sursa (job #632487) | Cod sursa (job #374129)
Cod sursa(job #374129)
#include<fstream>
int in[500001]; //
void Sh_modif(int* t,int st,int dr,int k)
{
int i,j,h=in[k],v;
while(k>=0)
{
for(i=st+h; i<=dr; i++)
{
j=i; v=t[i];
while(v < t[j-h] && j >= st+h) {t[j]=t[j-h]; j-=h;}
t[j]=v;
}
k--;
h=in[k];
}
}
int n,t[500003],a[180000],b[180005],val1,val2,i=0,j,k;
int main()
{freopen("algsort.in","r",stdin);
freopen("algsort.out","w",stdout);
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%d",&t[i]);
for(i=0;a[i-1]<n/3||i==0;i++)
a[i]=9*(1<<(2*i))-9*(1<<i)+1;
val1=i;
for(i=0;b[i-1]<n/3||i==0;i++)
b[i]=(1<<(2*i))-3*(1<<i)+1;
val2=i;
for(i=0,j=0,k=0;i<val1&&j<val2;k++)
if(a[i]<b[j]) {in[k]=a[i]; i++; }
else {in[k]=b[j]; j++; }
while(i<val1)
{in[k]=a[i]; k++; i++;}
while(j<val2)
{in[k]=b[j]; k++; j++;}
while(in[0]<=0)
{for(i=0;i<k;i++) in[i]=in[i+1];k--;}
Sh_modif(t,0,n,k);
for(i=1;i<=n;i++) printf("%d ",t[i]);
return 0;
}