Cod sursa(job #3233733)

Utilizator rapidu36Victor Manz rapidu36 Data 4 iunie 2024 19:40:04
Problema Sortare prin comparare Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>

using namespace std;

const int N = 5e5;

int n, nh, h[N], v[N];

int tata(int p)
{
    return (p - 1) / 2;
}

int fiul_s(int p)
{
    return 2 * p + 1;
}

int fiul_d(int p)
{
    return 2 * p + 2;
}

void urca(int p)
{
    while (p > 0 && h[p] < h[tata(p)])
    {
        swap(h[p], h[tata(p)]);
        p = tata(p);
    }
}

void coboara(int p)
{
    int fs = fiul_s(p), fd = fiul_d(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(optim);
    }
}

void adauga(int x)
{
    h[nh++] = x;
    urca(nh - 1);
}

void sterge(int p)
{
    if (p == nh - 1)
    {
        nh--;
        return;
    }
    h[p] = h[nh-1];
    nh--;
    urca(p);
    coboara(p);
}

int main()
{
    ifstream in("algsort.in");
    ofstream out("algsort.out");
    in >> n;
    for (int i = 0; i < n; i++)
    {
        int aux;
        in >> aux;
        adauga(aux);
    }
    for (int i = 0; i < n; i++)
    {
        v[i] = h[0];///aducem minimul dintre cele ramase pe pozitia i (ca la sortarea prin sel.)
        sterge(0);
    }
    for (int i = 0; i < n; i++)
    {
        out << v[i] << " ";
    }
    in.close();
    out.close();
    return 0;
}