Cod sursa(job #842259)

Utilizator Brz_VladBrezae Vlad Brz_Vlad Data 26 decembrie 2012 15:49:48
Problema Sortare prin comparare Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 0.96 kb
#include <stdio.h>

#define MAXN 500001

int N;
int Nm;
int v[MAXN];


void swap(int x, int y)
{
	int aux = v[x];
	v[x] = v[y];
	v[y] = aux;	
}

int max(int x, int y)
{
	if( v[x] > v[y] )
		return x;
	else
		return y;
}

void fall(int node)
{
	if( (2*node+1) <= N ){
		int maxim = max(2*node,2*node+1);
		if( v[node] < v[maxim] ){
			swap(node,maxim);
			fall(maxim);
		}
	}
	else if( (2*node) <= N ){
		if( v[node] < v[2*node] )
			swap(node,2*node);
	}
}

void heapify()
{
	int start=1;
	while( start < N )
		start *= 2;
	start = start/2;
	
	int i;
	while( start > 0 ){
		for(i=0;i<start;i++){
			fall(start+i);			
		}
		start /= 2;
	}
}

void heapsort()
{
	while(N > 1){
		swap(1,N);
		N--;
		fall(1);		
	}	
}


int main(int argc, char* argv[])
{
	freopen("algsort.in","r",stdin);
	freopen("algsort.out","w",stdout);
		
	scanf("%d",&N);
	int i=0;
	for(i=1;i<=N;i++)
		scanf("%d",&v[i]);
		
	heapify();
	Nm = N;
	heapsort();
	
	for(i=1;i<=Nm;i++)
		printf("%d ",v[i]);
	return 0;
}