Pagini recente » Cod sursa (job #833706) | Cod sursa (job #3326353) | Cod sursa (job #2291369) | Cod sursa (job #1629690) | Cod sursa (job #837945)
Cod sursa(job #837945)
#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) {
int par = pos >> 1;
if (A[par] < A[pos]) {
swap(par, pos);
pos = par;
} else {
return;
}
}
}
void heap_down(int pos)
{
while (pos <= size) {
int f = left(pos);
if (f <= size) {
if (f + 1 <= size && A[f + 1] > A[f])
f++;
if (A[f] > A[pos]) {
swap(f, pos);
pos = f;
} else {
return;
}
} else {
return;
}
}
}
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 << A[n] << '\n';
return 0;
}