Pagini recente » Cod sursa (job #1494035) | Cod sursa (job #2970454) | Cod sursa (job #2473461) | Cod sursa (job #1901986) | Cod sursa (job #1506113)
#include<stdio.h>
#include<random>
#include<time.h>
FILE *in, *out;
#define MAX 500001
void inline swap(int &a, int&b)
{
int t;
t = a;
a = b;
b = t;
}
int h[MAX],N,nh=0;
void go_top(int p)
{
while (p!=1 && h[p] < h[p / 2])
{
swap(h[p], h[p / 2]);
p = p / 2;
}
}
void go_down(int p)
{
int child;
do
{
child = 0;
if (p * 2 <= nh)
{
if (p * 2 + 1 > nh)
child = p * 2;
else
child = (h[p * 2] < h[p * 2 + 1]) ? (p * 2) : (p * 2 + 1);
if (h[p]>h[child])
{
swap(h[p], h[child]);
p = child;
}
}
} while (child);
}
void add_to_heap(int val)
{
h[++nh] = val;
go_top(nh);
}
void delete_from_heap(int p)
{
swap(h[p], h[nh]);
--nh;
if(nh>=1)
go_down(p);
}
void heapsort(FILE *&out)
{
while (nh >= 1)
{
fprintf(out, "%d ", h[1]);
delete_from_heap(1);
}
}
int main()
{
in = fopen("algsort.in", "r");
out = fopen("algsort.out", "w");
fscanf(in, "%d", &N);
int e;
for (int i = 1;i <= N;++i)
{
fscanf(in, "%d", &e);
add_to_heap(e);
}
heapsort(out);
return 0;
}