Cod sursa(job #2301165)

Utilizator CristyXtremeSimion Cristian CristyXtreme Data 12 decembrie 2018 18:29:50
Problema Sortare prin comparare Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
#include <stdio.h>

using namespace std;

unsigned int arb[10000000];

inline unsigned int minim(unsigned int a, unsigned int b) {
    if (a > b)
        return b;
    return a;
}

unsigned int construieste_arbint(int st, int dr, unsigned int *arb, int indice, unsigned int *A) {
    if (st == dr) {
        arb[indice] = A[st];
        return A[st];
    }
    int mij = st + (dr - st) / 2, a, b;
    a = construieste_arbint(st, mij, arb, 2 * indice + 1, A);           // mergem pe primul fiu in arbore, indexarea incepe de la 0 deci fiul stang va fi 2 * i + 1
    b = construieste_arbint(mij + 1, dr, arb, 2 * indice + 2, A);       // mergem pe al doilea fiu, cu indexul 2 * i + 2
    arb[indice] = minim(a, b);
    return minim(a, b);
}

void actualizeaza(unsigned int a, unsigned int b, int indice) {
    if (a == arb[indice] && arb[indice * 2 + 1] == (1 << 30) && arb[indice * 2 + 2] == (1 << 30)) {
        arb[indice] = b;
        return;
    }
    if (arb[indice * 2 + 1] == a)
        actualizeaza(a, b, indice * 2  + 1);
    else
        if (arb[indice * 2 + 2] == a)
            actualizeaza(a, b, indice * 2  + 2);
    arb[indice] = minim(arb[2 * indice + 1], arb[2 * indice + +2]);     //reactualizam minimul pe fiecare interval care continea valoarea a
}

int main() {
	freopen("algsort.in", "r", stdin);
	freopen("algsort.out", "w", stdout);
	int n;
	scanf("%d", &n);
    unsigned int A[n];
    for (int i = 0; i < n; i++)
        scanf("%u", &A[i]);
    for (int i = 0; i < 10000000; i++)
        arb[i] = (1 << 31);
    arb[0] = construieste_arbint(0, n - 1, arb, 0, A);
    for (int i = 0; i < n; i++) {
        // facem sortarea prin selectie luand mereu minimul din radacina arborelui, apoi updatam arborele
        printf("%d ", arb[0]);
        actualizeaza(arb[0], (1 << 31), 0);
    }
	return 0;
}