Pagini recente » Cod sursa (job #144324) | Cod sursa (job #1739236) | Cod sursa (job #1385681) | Cod sursa (job #781575) | Cod sursa (job #837926)
Cod sursa(job #837926)
#include <cstdio>
#include <iostream>
using namespace std;
#define left(x) (2 * (x))
#define right(x) (2 * (x) + 1)
const int MAXN = 500001;
int size;
int A[MAXN];
inline void swap(int i, int j)
{
int aux = A[i];
A[i] = A[j];
A[j] = aux;
}
void heap_up(int x)
{
A[++size] = x;
int pos = size;
while (pos > 1 && A[pos / 2] < A[pos]) {
swap(pos / 2, pos);
pos >>= 1;
}
}
void heap_down(int pos)
{
while (pos < size) {
int f = left(pos);
if (f < size && A[f] > A[pos]) {
if (f + 1 < size && A[f + 1] > A[f])
f++;
swap(f, pos);
pos = f;
} else {
break;
}
}
}
void hsort()
{
while (size > 1) {
swap(1, size);
size--;
heap_down(1);
}
}
int main()
{
freopen("algsort.in", "r", stdin);
freopen("algsort.out", "w", stdout);
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
int x; cin >> x;
heap_up(x);
}
hsort();
for (int i = 1; i <= n; ++i)
cout << A[i] << " ";
cout << '\n';
return 0;
}