Pagini recente » Cod sursa (job #75050) | Cod sursa (job #3293645) | Sedinta 2007-04-24 | Cod sursa (job #2007162) | Cod sursa (job #1996554)
#include <iostream>
#include <fstream>
#include <cstdio>
using namespace std;
ifstream fin("algsort.in");
ofstream fout("algsort.out");
int N;
int h[500005];
int f(int k)
{
return k/2;
}
int ls(int k)
{
return 2*k;
}
int rs(int k)
{
return 2*k + 1;
}
void NDown(int k)
{
int s;
do {
s = 0;
if (ls(k) <= N) /// are nod stang
s = ls(k);
if (rs(k) <= N && h[rs(k)] > h[ls(k)]) /// are nod drept -si- e mai mare
s = rs(k);
if (h[s] <= h[k]) /// nodul K e mai mare decat ambii fii
s = 0;
if (s)
{
swap(h[s], h[k]);
k = s;
}
} while (s);
}
void NUp(int k)
{
int key = h[k];
while (k > 1 && key > h[f(k)] )
{
h[k] = h[f(k)];
k = f(k);
}
h[k] = key;
}
void Eliminare(int k)
{
h[k] = h[N];
N--;
if (k > 1 && h[k] > h[f(k)])
NUp(k);
else
NDown(k);
}
void Inserare(int k)
{
N++;
h[N] = k;
NUp(N);
}
void Create_H()
{
int i;
for (i = N / 2; i > 0; i--)
NDown(i);
}
void Sortare()
{
int i, n;
n = N;
for (i = n; i >= 2; i--)
{
swap(h[1], h[i]);
N--;
NDown(1);
}
N = n;
}
int main()
{
int i;
fin >> N;
for (i = 1; i <= N; i++)
fin >> h[i];
Create_H();
Sortare();
for (i = 1; i <= N; i++)
fout << h[i] << " ";
fin.close();
fout.close();
return 0;
}