Cod sursa(job #3232269)

Utilizator rapidu36Victor Manz rapidu36 Data 29 mai 2024 17:28:05
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#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;
}