Pagini recente » Monitorul de evaluare | Istoria paginii utilizator/yeu1 | Cod sursa (job #2446892) | Istoria paginii utilizator/onutza999 | Cod sursa (job #543359)
Cod sursa(job #543359)
# include <stdio.h>
int n, heap[500005], i, a;
inline int dad (int a){
return a >> 1;
}
inline int son1 (int a){
return a << 1;
}
inline int son2 (int a){
return (a << 1) + 1;
}
void schimba (int &a, int &b){
int x = a;
a = b;
b = x;
}
void insertHEAP (int a){
heap[++heap[0]] = a;
int poz = heap[0];
for (; ; ){
int d = dad (poz);
if (heap[d] > heap[poz] && d > 0){
schimba (heap[d], heap[poz]);
schimba (d, poz);
}
else
break ;
}
}
void removeHEAP (int poz){
for (heap[1] = 2000000000; ; ){
int p1 = son1 (poz), p2 = son2 (poz);
if (heap[p1] >= heap[p2] && 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;
}