Cod sursa(job #2759997)

Utilizator rapidu36Victor Manz rapidu36 Data 22 iunie 2021 11:43:17
Problema Sortare prin comparare Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#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;
}