Cod sursa(job #1683848)

Utilizator mvcl3Marian Iacob mvcl3 Data 10 aprilie 2016 16:55:33
Problema Sortare prin comparare Scor 20
Compilator c Status done
Runda Arhiva educationala Marime 1.28 kb
#include <stdio.h>

long fiulStang(long radacina)
{
    return radacina * 2 + 1;
}

long fiulDrept(long radacina)
{
    return radacina * 2 + 2;
}

void swap(long *a, long *b)
{
    long aux;

    aux = *b;
    *b = *a;
    *a = aux;
}

void shift(long n, long nod, long *heap)
{
    long fiu;

    do {
        fiu = 0;

        if(fiulStang(nod) < n)  {
            fiu = fiulStang(nod);

            if(fiulDrept(nod) < n && heap[fiulDrept(nod)] > heap[fiulStang(nod)])
                fiu = fiulDrept(nod);

            if(heap[nod] >= heap[fiu])
                fiu = 0;
        }

        if(fiu) {
            swap(&heap[nod], &heap[fiu]);
            nod = fiu;
        }

    }   while( fiu );
}

int main()
{
    long i, n, *arr;

    FILE *in = fopen("algsort.in", "r");
    FILE *out = fopen("algsort.out", "w");

    fscanf(in, "%d", &n);

    arr = (long *) malloc(n * sizeof(long));

    for(i = 0; i < n; ++i)
        fscanf(in, "%d", &arr[i]);

    for(i = n / 2; i >= 0; --i)
        shift(n, i, arr);

    for(i = n - 1; i > 0; --i)  {
        swap(&arr[i], &arr[0]);
        shift(i - 1, 0, arr);
    }

    for(i = 0; i < n; ++i)
        fprintf(out, "%d ", arr[i]);

    fclose(out);
    fclose(in);

    return 0;
}