Cod sursa(job #543374)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 27 februarie 2011 22:29:58
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
# include <stdio.h>
unsigned int n, i, a;
unsigned int heap[500005];
inline unsigned int dad (unsigned int a){
	return a >> 1;
}
inline unsigned int son1 (unsigned int a){
	return a << 1;
}
inline unsigned int son2 (unsigned int a){
	return (a << 1) + 1;
}
void schimba (unsigned int &a, unsigned int &b){
	unsigned int x = a;
	a = b;
	b = x;
}
void insertHEAP (unsigned int a){
	heap[++heap[0]] = a;
	unsigned int poz = heap[0];
	for (; ; ){
		unsigned int d = dad (poz);
		if (heap[d] > heap[poz] && d > 0){
			schimba (heap[d], heap[poz]);
			schimba (d, poz);
		}
		else
			break ;
	}
}
void removeHEAP (unsigned int poz){
	for (heap[poz] = (1 << 32) - 1; ; ){
		unsigned int p1 = son1 (poz), p2 = son2 (poz);
		if ( (heap[p1] >= heap[p2] && heap[p2] > 0) && p2 <= heap[0]){
			schimba (heap[p2], heap[poz]);
			schimba (p2, poz);
		}
		else
		if ( (heap[p1] < heap[p2] || heap[p2] == 0) && p1 <= heap[0]){
			schimba (heap[p1], heap[poz]);
			schimba (p1, poz);
		}
		else
			break ;
	}
}
int main (){
	freopen ("algsort.in", "r", stdin);
	freopen ("algsort.out", "w", stdout);
	scanf ("%d", &n);
	for (i = 1; i <= n; ++i){
		scanf ("%d", &a);
		insertHEAP (a);
	}
	for (i = 1; i <= n; ++i){
		printf ("%d ", heap[1]);
		removeHEAP (1);
	}
	return 0;
}