Pagini recente » Cod sursa (job #109919) | Cod sursa (job #817050) | Cod sursa (job #831376) | Cod sursa (job #1373943) | Cod sursa (job #2073825)
#include <iostream>
#include <fstream>
#define Nmax 500005
using namespace std;
ifstream fin("algsort.in");
ofstream fout("algsort.out");
int n,v[Nmax];
void Citire ()
{
int i;
fin>>n;
for (i=1; i<=n; i++)
fin>>v[i];
}
void Percolate (int v[],int poz,int n)
{
if (v[poz/2]<v[poz]&&poz/2>0)
{
swap(v[poz/2],v[poz]);
Percolate(v,poz/2,n);
}
}
void Max_Heapify (int v[],int poz,int n)
{
if (v[poz*2]>v[poz]||v[poz*2+1]>v[poz])//daca are vreun fiu mai mare ca el
{
if (v[poz*2]>v[poz*2+1]&&2*poz<=n) //il iau pe cel mai mare si fac swap intre ei si continui ca sa vad daca a ajuns pe pozitia corecta
{
swap(v[poz],v[poz*2]);
if (poz*2 <= n/2) Max_Heapify(v,poz*2,n);
}
else
{ if (poz*2+1<=n)
swap(v[poz],v[poz*2+1]);
if (poz*2+1 <= n/2) Max_Heapify(v,poz*2+1,n);
}
}
}
void Creare_Heap ()
{
int i;
for (i=n/2; i>0; i--)
Max_Heapify(v,i,n);
}
void Dezradacinare (int v[],int &n)
{
int i;
swap(v[1],v[n]);
n--;
Max_Heapify(v,1,n);
}
void HeapSort(int v[],int n)
{int copie=n,i;
while (n>0)
Dezradacinare(v,n);
for (i=1;i<=copie;i++)
fout<<v[i]<<" ";
}
int main()
{ int i;
Citire();
Creare_Heap();
HeapSort(v,n);
return 0;
}