Pagini recente » Cod sursa (job #543329) | Cod sursa (job #2001503) | Monitorul de evaluare | Diferente pentru utilizator/dornescuvlad intre reviziile 102 si 46 | Cod sursa (job #543367)
Cod sursa(job #543367)
# include <stdio.h>
unsigned int n, i, a;
unsigned int heap[500005];
inline unsigned int dad (unsigned int a){
return a >> 1;
}
inline unsigned int son1 (unsigned int a){
return a << 1;
}
inline unsigned int son2 (unsigned int a){
return (a << 1) + 1;
}
void schimba (unsigned int &a, unsigned int &b){
unsigned int x = a;
a = b;
b = x;
}
void insertHEAP (unsigned int a){
heap[++heap[0]] = a;
unsigned int poz = heap[0];
for (; ; ){
unsigned int d = dad (poz);
if (heap[d] > heap[poz] && d > 0){
schimba (heap[d], heap[poz]);
schimba (d, poz);
}
else
break ;
}
}
void removeHEAP (unsigned int poz){
for (heap[poz] = (1 << 32) - 1; ; ){
unsigned int p1 = son1 (poz), p2 = son2 (poz);
if ( (heap[p1] >= heap[p2] && heap[p2] > 0) && p2 <= heap[0]){
schimba (heap[p2], heap[poz]);
schimba (p2, poz);
}
else
if ( (heap[p1] < heap[p2] || heap[p2] == 0) && p1 <= heap[0]){
schimba (heap[p1], heap[poz]);
schimba (p1, poz);
}
else
break ;
if (poz > (heap[0] >> 1) ) break ;
}
}
int main (){
freopen ("algsort.in", "r", stdin);
freopen ("algsort.out", "w", stdout);
scanf ("%d", &n);
for (i = 1; i <= n; ++i){
scanf ("%d", &a);
insertHEAP (a);
}
for (i = 1; i <= n; ++i){
printf ("%d ", heap[1]);
removeHEAP (1);
}
return 0;
}