Cod sursa(job #359638)

Utilizator cvicentiuCiorbaru Vicentiu Marian cvicentiu Data 27 octombrie 2009 21:40:55
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#define MaxN 500001
using namespace std;

int N, H[MaxN];
fstream fin ("algsort.in",ios::in);
fstream fout ("algsort.out",ios::out);


inline int l_son(int x){
	return 2*x;
};
inline int r_son(int x){
	return 2*x + 1;
};
inline int father(int x){
	return x/2;
};

void sus_heap(int poz, int val){
	while (H[father(poz)] > val && father(poz) > 0){
		H[poz] = H[father(poz)];
		poz = father(poz);
	}
	H[poz] = val;
};

void jos_heap(int poz, int val){
	int fiu;
	bool modif = false;

	do {
	modif = false;
	fiu = poz;
	if ( l_son(poz) <= N){
	
		if ( l_son(poz) <= N && H[l_son(poz)] < val)
			fiu =l_son(poz);
		
		if (r_son(poz) <= N && H[r_son(poz)] < val){
			if (fiu == l_son(poz) ){
				if ( H[fiu] > H[r_son(poz)] ) fiu = r_son(poz);
			} 
			else fiu = r_son(poz);
		};

	};
	if (fiu != poz) modif = true;
	H[poz] = H[fiu];
	poz = fiu;
	}
	while (modif);

	H[poz] = val;
};


int main(){

	fin>>N;
	for (int i = 1; i <= N; i++){
		fin>>H[i];
		sus_heap(i, H[i]);
	};
	for (; N>=1; --N){
		fout<<H[1]<<" ";
		H[1] = H[N];
		jos_heap(1,H[1]);
	};
}