Cod sursa(job #344674)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 31 august 2009 12:39:07
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <stdio.h>
#define N (1<<19)
int n, dim;
long long heap[N];
void interschimba(int poz1, int poz2)
{
	int temp = heap[poz1];
	heap[poz1] = heap[poz2];
	heap[poz2] = temp;
}
void muta_in_sus(int poz)
{
	if (poz > 1 && heap[poz/2] > heap[poz]) 
	{
		interschimba(poz, poz/2);
		muta_in_sus(poz/2);
	}
}
void muta_in_jos(int poz)
{
	if ((2*poz  <= n && heap[poz] > heap[2*poz] ) ||
		(2*poz+1<= n && heap[poz] > heap[2*poz+1])) 
		{
			int maximum = 2*poz;
			if (2*poz+1 <= n && heap[2*poz+1] < heap[2*poz]) 
				maximum = 2*poz+1;
			interschimba(poz, maximum);
			muta_in_jos(maximum);
		}
}
long long extrage_minim()
{
	int ret = heap[1];
	heap[1] = heap[n--];
	muta_in_jos(1);
	return ret;
}
void heapify()
{
	int i;
	for (i = n; i >=1; i--) 
		muta_in_jos(i);
}
inline int digit(char x)
{
	return '0'<= x && x <='9';
}
int main()
{
	freopen("algsort.in","r",stdin);
	freopen("algsort.out","w",stdout);
	int i;
	scanf("%d\n", &n);
	dim = n;
	n=0;
	char x,cif=0;
	long long nr=0;
	while (scanf("%c",&x)!=EOF)
		if (digit(x))
		{
			nr=nr*10+x-'0';
			cif=1;
		}
		else
			if (cif)
			{
				heap[++n]=nr;
				nr=0;
				cif=0;
			}
	heapify();
	for (i = 1; i <= dim; i++) 
		printf("%lld ", extrage_minim());
	return 0;
}