Pagini recente » Cod sursa (job #842350) | Cod sursa (job #2882457) | Cod sursa (job #5928) | Cod sursa (job #63390) | Cod sursa (job #1820909)
#include <stdio.h>
#include <iostream>
#define MAXN 500000 + 10
#define in "algsort.in"
#define out "algsort.out"
using namespace std;
FILE *f, *g;
int n, x, k;
int heap[MAXN];
inline int father(int k)
{
return k / 2;
}
inline int left_son(int k)
{
return k * 2;
}
inline int right_son(int k)
{
return k * 2 + 1;
}
inline void jos(int k, int n)
{
int son;
do
{
son = 0;
if (left_son(k) <= n)
{
son = left_son(k);
if (right_son(k) <= n && heap[right_son(k)] > heap[son])
{
son = right_son(k);
}
if (heap[son] < heap[k])
{
son = 0;
}
}
if (son)
{
swap(heap[k], heap[son]);
k = son;
}
}
while (son);
}
inline void sus(int k, int n)
{
int x = heap[k];
while (k > 1 && x > heap[father(k)])
{
swap(heap[k], heap[father(k)]);
k = father(k);
}
}
inline void add(int x)
{
heap[++k] = x;
sus(k, 1);
}
inline void read_()
{
fscanf(f, "%d", &n);
for (int i = 1; i <= n; i++)
{
fscanf(f, "%d", &x);
add(x);
}
}
inline void heapsort()
{
for (int i = n / 2; i > 0; i--)
jos(i, n);
for (int i = n; i >= 2; i--)
{
swap(heap[1], heap[i]);
jos(1, i - 1);
}
}
inline write_()
{
for (int i = 1; i <= n; i++)
fprintf(g, "%d ", heap[i]);
}
int main()
{
f = fopen(in, "r");
g = fopen(out, "w");
read_();
heapsort();
write_();
fclose(f);
fclose(g);
}