Cod sursa(job #543364)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 27 februarie 2011 22:15:33
Problema Sortare prin comparare Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
# include <stdio.h>
int n, heap[500005], i, a;
inline int dad (int a){
	return a >> 1;
}
inline int son1 (int a){
	return a << 1;
}
inline int son2 (int a){
	return (a << 1) + 1;
}
void schimba (int &a, int &b){
	int x = a;
	a = b;
	b = x;
}
void insertHEAP (int a){
	heap[++heap[0]] = a;
	int poz = heap[0];
	for (; ; ){
		int d = dad (poz);
		if (heap[d] > heap[poz] && d > 0){
			schimba (heap[d], heap[poz]);
			schimba (d, poz);
		}
		else
			break ;
	}
}
void removeHEAP (int poz){
	for (heap[poz] = (1 << 31) - 1; ; ){
		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 ;
		if (poz > (heap[0] >> 1) ) 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;
}