Cod sursa(job #374740)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 18 decembrie 2009 11:18:30
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
# include <cstdio>

using namespace std;

# define FIN "algsort.in"
# define FOUT "algsort.out"
# define MAX_N 500001

int V[MAX_N];
int inc[MAX_N];
int N, i, ind1, ind2, vl1, vl2, ct;

    void shell(int *v, int st, int dr, int ct)
    {
        int i, j, k, val;
        
        for (i = ct; i >= 0; --i)
           for (j = st + inc[i]; j <= dr; ++j)
           {
               k = j; val = v[j];
               while (k >= st + inc[i])
                  if (v[k - inc[i]] > val) v[k] = v[k - inc[i]], k -= inc[i];
                  else break;
               v[k] = val;
           }
    }

    int main()
    {
        freopen(FIN, "r", stdin);
        freopen(FOUT, "w", stdout);
        
        scanf("%d", &N);
        for (i = 1; i <= N; ++i) scanf("%d", &V[i]);
        
        ind1 = 1; ind2 = 4; ct = -1;
        while (1)
        {
              vl1 = 9 * ind1 * (ind1 - 1) + 1;
              vl2 = ind2 * (ind2 - 3) + 1;
              
              if (vl1 <= vl2)
              {
                   if (vl1 > N / 3 && vl1 != 1) break;
                   if (vl1 != inc[ct]) inc[++ct] = vl1;
                   ind1 <<= 1;
              } else
              {
                   if (vl2 > N / 3 && vl1 != 1) break;
                   if (vl2 != inc[ct]) inc[++ct] = vl2;
                   ind2 <<= 1;
              }
        }
        
        shell(V, 1, N, ct);
        
        for (i = 1; i <= N; ++i) printf("%d ", V[i]);
        
        return 0;
    }