Cod sursa(job #302942)

Utilizator razyelxrazyelx razyelx Data 9 aprilie 2009 13:44:02
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <stdio.h>

#define MAXN 500005

FILE * fin  = fopen("algsort.in", "r");
FILE * fout = fopen("algsort.out","w");

long long n, v[MAXN], N;

void adauga_in_heap(int x,int i){
	while(i > 1)
		if(v[i] >= v[i>>1]){ v[i]^=v[(i>>1)]^=v[i]^=v[i>>1]; i>>=2;}
		else i = 1;
}
int extract(){
	int x = v[1],i,j;
	v[1] = v[n];
	n--; i = 1;
	
	while(i<=n)
		if(i<<1 <= n){
			j = i<<1;
			if(j+1<=n && v[j+1] >= v[j]) j++;
			if(v[i] <= v[j]){ v[j]^=v[i]^=v[j]^=v[i]; i = j;}
			else i = n+1;
		} else i = n+1;
	
	return x;
}
	
void citire(){
	fscanf(fin, "%lld", &n);
	N = n;
	
	fscanf(fin, "%lld", &v[1]);
	for(int i=2; i<=n; ++i){
		fscanf(fin, "%lld", &v[i]);
		adauga_in_heap(v[i],i);
	}		
}
void heap_sort(){
	for(int i=n; i>1; --i) v[i] = extract();
}
void afisare(){
	for(int i=1; i<=N; ++i) fprintf(fout, "%lld ", v[i]);
}
int main(){
	citire();
	heap_sort();
	afisare();
	return 0;
}