Pagini recente » Cod sursa (job #1557768) | Cod sursa (job #2059997) | Istoria paginii runda/1_martie_simulare_oji_2024_clasele_11_12/clasament | Istoria paginii runda/simulare-cartita-51b/clasament | Cod sursa (job #2759997)
#include <stdio.h>
#include <stdlib.h>
#define N 500001
int h[N], nh, n;
void schimba(int p1, int p2)
{
///schimba intre ele elem. de pe poz. p1 si p2
int aux = h[p1];
h[p1] = h[p2];
h[p2] = aux;
}
void urca(int p)
{
while (p > 1 && h[p] > h[p/2])///cat timp elem. curent e mai bun ca tatal sau
{
schimba(p, p/2);
p /= 2;///continuam urcarea
}
}
void adauga(int val)
{
h[++nh] = val;///il pun la final pentru a avea arb. bin. complet
urca(nh);///pentru a pastra proprietatea de heap
}
void coboara(int p)
{
///daca h[p] e mai rau ca (cel putin) unul dintre fii
///il schimb cu cel mai bun dintre fii
int fs = 2*p, fd = 2*p + 1, bun = p;
if (fs <= nh && h[fs] > h[bun])///fiul stang exista si e mai bun ca tatal
{
bun = fs;
}
if (fd <= nh && h[fd] > h[bun])///fiul drept exista si e mai bun ca tatal
{
bun = fd;
}
if (bun != p)///unul dintre fii e mai bun ca tatal
{
schimba(p, bun);
coboara(bun);///coboram in continuare pentru a reface heap-ul
}
}
int main()
{
FILE *in, *out;
in = fopen("algsort.in", "r");
out = fopen("algsort.out", "w");
fscanf(in, "%d", &n);
int i;
for (i = 1; i <= n; i++)
{
int aux;
fscanf(in, "%d", &aux);
adauga(aux);
}
for (i = 0; i < n; i++)
{
schimba(1, nh--);
coboara(1);
}
for (i = 1; i <= n; i++)
{
fprintf(out, "%d ", h[i]);
}
fclose(in);
fclose(out);
return 0;
}