Cod sursa(job #404402)

Utilizator vasilemureVasile Mure vasilemure Data 26 februarie 2010 09:00:52
Problema Sortare prin comparare Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <stdio.h>
#include <algorithm>

#define Nmax 500005
#define INF (1<<31) - 1

using namespace std;

long n, i, j, aux, N;
long v[Nmax];


void UP (int i){
	
	aux = v[i];
	
	while (v[i/2] < aux){
		v[i] = v[i/2];
		i = i >> 1;
	}
	
	v[i] = aux;
}

void DOWN (int i){
	
	aux = v[i];
	
	while ((aux < v[2*i] || aux < v[2*i + 1]) && (2 * i < n)){
		
		if (v[2*i] > v[2*i + 1])
			j = 2*i;
		else 
			j = 2*i + 1;
		
		v[i] = v[j];
		i = j;
	}
	
	v[i] = aux;
	
}


void HEAPSORT(){
	
	while (n-2){
		aux = v[1];
		v[1] = v[n];
		v[n] = aux;
		
		n--;
		i = 1;
		
		if (v[i] < v[2*i] || v[i] < v[2*i + 1]){
			DOWN(i);
			
		}
	}
}

int main (){
	
	FILE * f = fopen ("algsort.in", "r");
	FILE * g = fopen ("algsort.out", "w");
	
	v[0] = INF;
	
	fscanf (f, "%ld", &n);
	
	N = n;
		
	for (i = 1 ; i <= n ; i++){
		
		fscanf (f, "%ld", &v[i]);
		
		if (v[i/2] < v[i])
			UP(i);
	}
	
	HEAPSORT();

	for (i = 1 ; i <= N ; i++)
		fprintf(g, "%ld ", v[i]);
	
	fclose(f);
	fclose(g);
	return 0;
}