Pagini recente » Cod sursa (job #364188) | Cod sursa (job #2937099) | Cod sursa (job #1616803) | Cod sursa (job #842716) | Cod sursa (job #1785617)
#include <cstdlib>
#include <cstdio>
#include <cmath>
#define inf 1 << 31
#define min(a, b) ((a) < (b) ? (a) : (b))
using namespace std;
FILE *f = fopen("algsort.in", "r");
FILE *g = fopen("algsort.out", "w");
unsigned int n, l, *v, *B, k;
void UpdateMin(int b)
{
unsigned int minim = v[b * l];
if(b < l)
{
for (int i = b * l; i < (b + 1) * l; ++i)
minim = min(minim, v[i]);
}
else if (b == l && n > l * l)
{
for (int i = b * l; i < n; ++i)
minim = min(minim, v[i]);
}
B[b] = minim;
}
bool SirValid()
{
for (int i = 0; i <= l; i++)
if (B[i] != inf)
return true;
return false;
}
void InlocuiesteMin(int b)
{
unsigned int minim = B[b];
if(b < l)
{
for (int i = b * l; i < (b + 1) * l; ++i)
if (v[i] == minim)
v[i] = inf;
}
else if (b == l && n > l * l)
{
for (int i = b * l; i < n; ++i)
if (v[i] == minim)
v[i] = inf;
}
}
int main()
{
int imin;
fscanf(f, "%u", &n);
v = (unsigned int*)calloc(n + 1, sizeof(unsigned int));
unsigned int *rez = (unsigned int*)calloc(n + 1, sizeof(unsigned int));
for (int i = 0; i < n; ++i)
fscanf(f, "%u", &v[i]);
l = sqrt(double(n));
B = (unsigned int*)calloc(l + 1, sizeof(unsigned int));
for (int i = 0; i <= l; ++i)
UpdateMin(i);
while (SirValid())
{
unsigned int minim = inf;
imin = 0;
for (int i = 0; i <= l; ++i)
{
if (minim > B[i])
{
minim = B[i];
imin = i;
}
}
if(minim != inf)
{
fprintf(g, "%u ", minim);
InlocuiesteMin(imin);
UpdateMin(imin);
}
}
return 0;
}