Pagini recente » Cod sursa (job #309229) | Borderou de evaluare (job #2679244) | Cod sursa (job #310952) | Cod sursa (job #1604127) | Cod sursa (job #3232269)
#include <fstream>
using namespace std;
const int N = 5e5;
int h[N], v[N];
int tata(int p)
{
return (p - 1) / 2;
}
int fiu_stang(int p)
{
return 2 * p + 1;
}
int fiu_drept(int p)
{
return 2 * p + 2;
}
bool heap_vid(int h[], int nh)
{
return (nh == 0);
}
void urca(int h[], int p)
{
while (p > 0 && h[p] < h[tata(p)])
{
swap(h[p], h[tata(p)]);
p = tata(p);
}
}
void adauga(int h[], int &nh, int x)
{
h[nh++] = x;
urca(h, nh - 1);
}
void coboara(int h[], int nh, int p)
{
int fs = fiu_stang(p), fd = fiu_drept(p), optim = p;
if (fs < nh && h[fs] < h[optim])
{
optim = fs;
}
if (fd < nh && h[fd] < h[optim])
{
optim = fd;
}
if (optim != p)
{
swap(h[p], h[optim]);
coboara(h, nh, optim);
}
}
void sterge(int h[], int &nh, int p)
{
h[p] = h[nh-1];
nh--;
if (p == nh)///trebuia sters ultimul element
{
return;
}
urca(h, p);
coboara(h, nh, p);
}
int main()
{
ifstream in("algsort.in");
ofstream out("algsort.out");
int n, nh = 0;
in >> n;
for (int i = 0; i < n; i++)
{
int aux;
in >> aux;
adauga(h, nh, aux);
}
n = 0;
while(!heap_vid(h, nh))
{
v[n++] = h[0];
sterge(h, nh, 0);
}
for (int i = 0; i < n; i++)
{
out << v[i] << " ";
}
out << "\n";
in.close();
out.close();
return 0;
}