Cod sursa(job #1313562)

Utilizator eneandradaEne Oana-Andrada eneandrada Data 10 ianuarie 2015 20:43:45
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f("algsort.in");
ofstream g("algsort.out");


int N,v[500000],i,heapsize;

int left(int i)
{
    return 2*i; //poz fiu stang
}

int right(int i)
{
    return 2*i+1; //poz fiu drept
}

int parent(int i)
{
    return i/2; //poz tata
}

void maxheapify(int v[500000],int i) //restabileste proprietatea de maxheap in caz ca v[i] o incalca
{
    int l=left(i);
    int r=right(i);
    int largest;
    if(v[l]>v[i] && l<heapsize)
        largest=l;
    else
        largest=i;
    if(v[r]>v[largest] && r<heapsize)
        largest=r; // se cauta cel mai mare dintre v[i], v[left(i)] si v[right(i)]
    if(largest!=i)
        {
            swap(v[i],v[largest]); // si se pune in locul lui v[i]
            maxheapify(v,largest);
        }
}

void buildmaxheap(int v[500000])
{
    heapsize=N;
    for(int i=N/2;i>=1;i--) //de la n/2+1 .. n elemente sunt frunze=maxheapuri triviale
        maxheapify(v,i);
}

void heapsort(int v[500000])
{
    buildmaxheap(v);
    for(int i=N;i>=2;i--)
        {
            swap(v[1],v[i]); //in v[1] va fi mereu cea mai mare valoare
            heapsize--;
            maxheapify(v,1); //il duce la locul lui pe elementul aflat acum pe pozitia 1 dupa interchimbare
        }
}

int main()
{
    f>>N;
    for(i=1;i<=N;i++)
        f>>v[i];
    heapsize=N;
    heapsort(v);
    for(i=1;i<=N;i++)
        g<<v[i]<<" ";
    f.close(); g.close();
    return 0;
}