Pagini recente » Cod sursa (job #1400278) | Cod sursa (job #2063386) | Cod sursa (job #120063) | Cod sursa (job #1853395) | Cod sursa (job #1313562)
#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;
}