Cod sursa(job #449421)

Utilizator ChallengeMurtaza Alexandru Challenge Data 6 mai 2010 12:33:03
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <stdio.h>

const char InFile[]="algsort.in";
const char OutFile[]="algsort.out";
const char RMode[]="r";
const char WMode[]="w";
const int MaxN=500005;

typedef unsigned long int UI32;

FILE *f;
UI32 v[MaxN],n;

UI32 stanga(UI32 i)
{
	return i<<1;
}

UI32 dreapta(UI32 i)
{
	return (i<<1)+1;
}

void reconstituire_heap(UI32 v[], UI32 i)
{
	UI32 maxim=i,st=stanga(i),dr=dreapta(i);
	if(st<=v[0])
		if(v[st]>v[maxim])
			maxim=st;
	if(dr<=v[0])
		if(v[dr]>v[maxim])
			maxim=dr;
	if(maxim!=i)
	{
		UI32 temp=v[i];
		v[i]=v[maxim];
		v[maxim]=temp;
		reconstituire_heap(v,maxim);
	}
}

void construiere_heap(UI32 v[])
{
	for(register UI32 i=v[0]/2;i>0;--i)
	{
		reconstituire_heap(v,i);
	}
}

void heapsort(unsigned long int v[])
{
	UI32 temp;
	construiere_heap(v);
	while(v[0]>0)
	{
		temp=v[v[0]];
		v[v[0]]=v[1];
		v[1]=temp;
		--v[0];
		reconstituire_heap(v,1);
	}
}

int main()
{
	f=fopen(InFile,RMode);
	fscanf(f,"%lu",&n);
	v[0]=n;
	for(register UI32 i=1;i<=n;++i)
	{
		fscanf(f,"%lu",&v[i]);
	}
	fclose(f);
	
	heapsort(v);
	
	f=fopen(OutFile,WMode);
	for(register UI32 i=1;i<=n;++i)
	{
		fprintf(f,"%lu ",v[i]);
	}
	fclose(f);
	return 0;
}