Pagini recente » Cod sursa (job #3229785) | Cod sursa (job #1905173) | Cod sursa (job #822283) | Cod sursa (job #1983305) | Cod sursa (job #1313987)
#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;
}