Mai intai trebuie sa te autentifici.
Cod sursa(job #1784836)
Utilizator | Data | 20 octombrie 2016 15:54:39 | |
---|---|---|---|
Problema | Sortare prin comparare | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.24 kb |
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#define NMAX 500001
#define SMAX 710
#define INF ((1 << 32)- 1)
using namespace std;
unsigned int A[NMAX], n, A_MIN[111];
ifstream in("algsort.in");
ofstream out("algsort.out");
void Update(int B)
{
unsigned int L = sqrt(n);
unsigned int minim = A[B*L + 1];
for (unsigned int i = B*L + 1; i <= (B + 1) * L && i <= n; ++i)
minim = min(minim, A[i]);
A_MIN[B + 1] = minim;
}
int main()
{
in >> n;
for (unsigned int i = 1; i <= n; ++i)
in >> A[i];
in.close();
unsigned int L = sqrt(n);
unsigned int length = L;
if ((double)L < sqrt(n))
L++;
for (unsigned int i = 1; i <= L; ++i)
Update(i - 1);
for (unsigned int j = 1; j <= n; ++j)
{
unsigned int minn = A_MIN[1], buc = 1;
for (unsigned int i = 2; i <= L; ++i)
if (minn > A_MIN[i])
{
minn = A_MIN[i];
buc = i;
}
out << minn << " ";
unsigned int x = 2 * buc - 1;
unsigned int y = x + length - 1;
for (unsigned int i = x; i <= y; ++i)
if (A[i] == minn)
{
A[i] = INF;
break;
}
minn = A[x];
for (unsigned int i = x + 1; i <= y; ++i)
{
if (minn > A[i])
minn = A[i];
}
A_MIN[buc] = minn;
}
out.close();
}