Pagini recente » Cod sursa (job #460651) | Cod sursa (job #2075441) | Cod sursa (job #2115458) | Cod sursa (job #66162) | Cod sursa (job #2301165)
#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;
}