Cod sursa(job #1785626)

Utilizator crazylamaRiclea Andrei crazylama Data 21 octombrie 2016 18:18:14
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.34 kb
#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;
int nr;

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;
                nr++;
            }
    }
    else if (b == l && n > l * l)
    {
        for (int i = b * l; i < n; ++i)
            if (v[i] == minim)
            {
                v[i] = inf;
                nr++;
            }
    }
}

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);
    /*for (int k = 0; k < n; ++k)
        printf("%u ",v[k]);
    printf("\n");
    for (int k = 0; k <= l; ++k)
        printf("%u ",B[k]);
    printf("\n");*/
    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)
        {
            InlocuiesteMin(imin);
            while (nr)
            {
                fprintf(g, "%u ", minim);
                nr--;
            }
            UpdateMin(imin);
            /*for (int k = 0; k <= l; ++k)
                printf("%u ",B[k]);
            printf("\n");*/
        }
    }
    return 0;
}