Pagini recente » Cod sursa (job #3135070) | Cod sursa (job #980209) | Cod sursa (job #3179243) | Cod sursa (job #799220) | Cod sursa (job #1170716)
#include <fstream>
#define NMax 500005
using namespace std;
ifstream fin("algsort.in");
ofstream fout("algsort.out");
int X[NMax],H[NMax];
int N,NHeap;
void Read()
{
fin>>N;
for(int i=1;i<=N;i++)
fin>>X[i];
}
void UpHeap(int P)
{
int F=P/2;
while(P && H[F]>H[P])
{
swap(H[P],H[F]);
P=P/2;
}
}
void DownHeap(int P)
{
int Ok,Son;
do{
Ok=1;
if(2*P+1<=NHeap)
{
if(H[2*P]<H[2*P+1])
Son=2*P;
else
Son=2*P+1;
if(H[Son]<H[P])
{
swap(H[Son],H[P]);
P=Son;
Ok=0;
}
}
else
if(2*P<=NHeap)
{
Son=2*P;
}
if(H[Son]<H[P])
{
swap(H[Son],H[P]);
P=Son;
Ok=0;
}
}
while(!Ok);
}
void BuildHeap()
{
for(int i=1;i<=N;i++)
{
int V=X[i];
H[++NHeap]=V;
UpHeap(NHeap);
}
}
void HeapSort()
{
for(int i=1;i<=N;i++)
{
X[i]=H[1];
H[1]=H[NHeap];
NHeap--;
DownHeap(1);
}
}
void Print()
{
for(int i=1;i<=N;i++)
fout<<X[i]<<" ";
}
int main()
{
Read();
BuildHeap();
HeapSort();
Print();
}