Cod sursa(job #1313987)

Utilizator eneandradaEne Oana-Andrada eneandrada Data 11 ianuarie 2015 13:36:54
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <iostream>
#include <fstream>

using namespace std;

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


int N,v[500005],i,heapsize;
int H[500005];

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[],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 Insert(int x)
{
    H[++heapsize] = x;
    int poz = heapsize;
    while (poz > 1 && H[parent(poz)] < H[poz])
    {
        swap(H[parent(poz)], H[poz]);
        poz = parent(poz);
    }
}

void buildmaxheap(int v[])
{
    heapsize=0;
    for (int i = 1; i <= N; ++ i)
        Insert(v[i]);
}

void Delete()
{
    H[1] = H[heapsize -- ];
    maxheapify(H, 1);
}

void heapsort(int v[])
{
    buildmaxheap(v);
    for(int i=N;i>=1;i--)
        {
            v[i] = H[1];
            Delete();
        }
}

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