Cod sursa(job #1279393)

Utilizator TheNechizFMI Razvan Birisan TheNechiz Data 30 noiembrie 2014 11:45:43
Problema Sortare prin comparare Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.68 kb
# include <stdio.h>
# define InFile "algsort.in"
# define OutFile "algsort.out"
# define dim 500000

int v[dim],n;
/*
    Parinte = (i-1)/2;
    FiuStanga = 2i+1;
    FiuDreapta = 2i+2;
*/
void swap( int *x, int *y )
{
    int aux = *x;
    *x = *y;
    *y =aux;
}

void Citire()
{
    int i;
    scanf("%d",&n);
    for( i = 0 ; i < n ; ++i )
        scanf("%d",v+i);
}

void Afisare()
{
    int i;
    for( i = 0 ; i < n ; ++i )
        printf("%d ",v[i]);
}

void MaxHeap( int v[dim], int start, int end )
{
    /*
        start = ultimul parinte
        end = fiul din dreapta al ultimului parinte
    */
    int rad = start,fiu,caut;

    while( rad*2+1 <= end )
        // Cat timp parintele are cel putin un fiu
    {
        fiu = rad*2+1; // fiul din stanga
        caut = rad; // caut un fiu mai mare decat tatal

        if( v[caut] < v[fiu] )
            caut = fiu;
        if( fiu+1 <= end && v[caut] < v[fiu+1] )
            caut = fiu+1;

        if( caut != rad )
        {
            swap(v+caut,v+rad);
            rad = caut;
        }
        else
            return;
    }

}

void CreareHeap( int v[dim], int n )
{
    int ultim = ((n-1)-1)/2;

    while( ultim >= 0 )
    {
        MaxHeap(v,ultim,n-1);
        --ultim;
    }
}

void HeapSort( int v[dim], int n )
{
    CreareHeap(v,n);
    int ultim = n-1;

    while( ultim > 0 )
    {
        swap(v+ultim,v);
        --ultim;
        MaxHeap(v,0,ultim);
    }
}

int main()
{
    freopen(InFile,"r",stdin);
    freopen(OutFile,"w",stdout);

    Citire();
    HeapSort(v,n);
    Afisare();

    fclose(stdin);
    fclose(stdout);
    return 0;
}