Cod sursa(job #1506113)

Utilizator ArkinyStoica Alex Arkiny Data 20 octombrie 2015 00:04:24
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#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;
}