Cod sursa(job #1028097)

Utilizator impulseBagu Alexandru impulse Data 13 noiembrie 2013 17:22:09
Problema Sortare prin comparare Scor 40
Compilator c Status done
Runda Arhiva educationala Marime 1.33 kb
#include <stdio.h>
#include <math.h>

#define fin "algsort.in", "r"
#define fou "algsort.out", "w"

typedef unsigned long kint;

int main()
{
    int n, i, k, l;
    FILE* in = fopen(fin);
    FILE* out = fopen(fou);

    fscanf(in, "%d", &n);
    k = sqrt(n);
    //l = 5;
    //k = n / l;
    l = k;
    if(l * k != n) k++;
    kint* A = malloc(sizeof(kint) * (k * l));
    kint* B = malloc(sizeof(kint) * (k + 1));
    for(i = (k - 1) * l; i < k * l; i++)
        A[i] = -1;
    for(i = 0; i < n; i++)
    {
        fscanf(in, "%u", &A[i]);
        if(i % l == 0 || B[i / l] > A[i])
            B[i / l] = A[i];
    }
    unsigned int kmin, mmin;
    int kp;
    while(1)
    {
        kp = -1;
        kmin = ~0;
        for(i = 0; i < k; i++)
            if(kmin > B[i] && B[i] != -1)
                    kmin = B[i],
                        kp = i;
        if(kp == -1) break;
        fprintf(out, "%u ", kmin);
        for(i = kp * l; i < kp * l + l; i++)
        {
            if(A[i] == kmin)
            {
                A[i] = -1;
                break;
            }
        }
        mmin = ~0;
        for(i = kp * l; i <  kp * l + l; i++)
            if(mmin > A[i] && A[i] != -1)
                mmin = A[i];
        if(mmin == ~0) mmin = -1;
        B[kp] = mmin;
    }
    return 0;
}