Pagini recente » Cod sursa (job #676669) | Cod sursa (job #572144) | Cod sursa (job #595541) | Cod sursa (job #566313) | Cod sursa (job #1785753)
#include <iostream>
#include <fstream>
#include <cmath>
#include <algorithm>
#define NMAX 500001
#define SMAX 710
#define INF ((1U << 32) - 1)
using namespace std;
ifstream in("algsort.in");
ofstream out("algsort.out");
unsigned int A[NMAX], n, m, poz[NMAX];
unsigned int A_MIN[SMAX], dx[SMAX], dy[SMAX];
int main()
{
in >> n;
for (unsigned int i = 1; i <= n; ++i)
in >> A[i];
in.close();
unsigned int piece, length = sqrt(n);
unsigned int L = n / length;
if ((double) L < (1.0 * n) / length)
L++;
for (unsigned int i = 0; i < L - 1; ++i)
{
A_MIN[i] = NMAX;
dx[i] = i * length + 1;
dy[i] = dx[i] + length - 1;
}
A_MIN[L - 1] = NMAX;
dx[L - 1] = (L - 1) * length + 1;
dy[L - 1] = n;
for (unsigned int i = 1; i <= n; ++i)
{
piece = (i - 1) / length;
A_MIN[piece] = min(A_MIN[piece], A[i]);
poz[i] = piece;
}
unsigned int minn, p;
for (unsigned int j = 1; j <= n; ++j)
{
minn = A_MIN[0], p = 0;
for (unsigned int i = 1; i < L; ++i)
if (minn > A_MIN[i])
{
minn = A_MIN[i];
p = i;
}
out << minn << " ";
for (unsigned int i = dx[p]; i <= dy[p]; ++i)
if (A[i] == minn)
{
A[i] = INF;
break;
}
A_MIN[p] = INF;
for (unsigned int i = dx[p]; i <= dy[p]; ++i)
A_MIN[p] = min(A_MIN[p],A[i]);
}
out.close();
return 0;
}