Pagini recente » Cod sursa (job #2024325) | Cod sursa (job #936944) | Cod sursa (job #993879) | Cod sursa (job #2670864) | Cod sursa (job #374740)
Cod sursa(job #374740)
# 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;
}