Cod sursa(job #374341)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 16 decembrie 2009 19:25:02
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
/*
   Shell Sort using Sedgewick's increments 
   9*4^i- 9*2^i + 1, 4^i - 3*2^i +1
   O(N^(4/3))
*/
#include <cstdio>
const int NMAX=500005;
int N,x[NMAX],inc[32];
int main()
{
    int i,j,k,a,b,na,nb;
    freopen("algsort.in","r",stdin);
    freopen("algsort.out","w",stdout);
    scanf("%d",&N);
    for (i=1;i<=N;++i) scanf("%d",&x[i]);
    
    na=0;nb=2;
    while (1)
    {
       a=1<<na;
       a*=9*(a-1);
       a++;
       if (3*a <= N) inc[++inc[0]]=a;
       else break;
       b=1<<nb;
       b*=b-3;
       b++;
       if (3*b <= N) inc[++inc[0]]=b;
       else break;
       ++na;++nb;
    }
       
    for (i=inc[0];i;i--)
    {
        for (j=inc[i]+1;j<=N;++j)
        {
            a=x[j];k=j-inc[i];
            while (k>0 && x[k] > a)
            {
                  x[k+inc[i]]=x[k];
                  k-=inc[i];
            }
            x[k+inc[i]]=a;
        }
    }
    
    for (i=1;i<=N;++i) printf("%d ",x[i]);
    return 0;
}