Cod sursa(job #751918)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 27 mai 2012 13:48:30
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb

#include <fstream>

void heapify (signed int array [ ], unsigned int index, unsigned int max)
{
    unsigned int left(index << 1), right(left);
    ++left;
    right += 2;
    unsigned int largest(index);
    if (left < max && array[left] > array[largest])
        largest = left;
    if (right < max && array[right] > array[largest])
        largest = right;
    if (index != largest)
    {
        array[index] ^= array[largest];
        array[largest] ^= array[index];
        array[index] ^= array[largest];
        heapify(array,largest,max);
    }
}

void build_heap (signed int array [ ], unsigned int n)
{
    unsigned int i((n >> 1) - 1);
    while (true)
    {
        heapify(array,i,n);
        if (i == 0)
            break;
        --i;
    }
}

void heapsort (signed int array [ ], unsigned int n)
{
    build_heap(array,n);
    --n;
    while (true)
    {
        if (*array != array[n])
        {
            *array ^= array[n];
            array[n] ^= *array;
            *array ^= array[n];
        }
        if (n)
        {
            heapify(array,0,n);
            --n;
        }
        else
            break;
    }
}

int main (void)
{
    unsigned int n;
    std::ifstream input("algsort.in");
    input >> n;
    signed int *v(new signed int [n]), *it(v), *limit(v + n);
    do
    {
        input >> *it;
        ++it;
    }
    while (it < limit);
    input.close();
    heapsort(v,n);
    it = v;
    --limit;
    std::ofstream output("algsort.out");
    while (true)
    {
        output << *it;
        if (it == limit)
            break;
        output.put(' ');
        ++it;
    }
    output.put('\n');
    output.close();
    return 0;
}