Cod sursa(job #278267)

Utilizator TabaraTabara Mihai Tabara Data 12 martie 2009 10:46:21
Problema Sortare prin comparare Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.19 kb
/*
11.03.2009
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define in "algsort.in"
#define out "algsort.out"

#define st(x) ((x)<<1)
#define dr(x) (((x)<<1)+1)
#define tata(x) ((x)>>1)

int n;
int dim_heap;

void HeapSort(int *);
void BuildHeap(int*);
void ReBuildHeap(int *, int );

int main(void)
{
	freopen( in, "r", stdin );
	freopen ( out, "w", stdout );

	scanf( "%d", &n );
	
	int i;
	int *A;
	A = (int*)calloc(n+1,sizeof(int));
	
	srand(time(NULL));
	for ( i = 1; i <= n; ++i )	
		scanf ( "%d", (A+i) );
	
	HeapSort(A);	
	
	for ( i = 1; i <= n; ++i )
		printf ( "%d ", *(A+i) );
		
	free(A);
	return 0;
}

void HeapSort(int* A)
{
	BuildHeap(A);
	
	int i, aux;
	
	for ( i = n; i >= 2; --i )
	{
		aux = A[i];
		A[i] = A[1];
		A[1] = aux;
		dim_heap--;
		ReBuildHeap(A,1);
	}
}

void BuildHeap(int* A)
{
	int i;
	dim_heap = n;
	for ( i = (n>>1); i >= 1; --i )
		ReBuildHeap(A,i);
}

void ReBuildHeap(int *A, int i )
{
	int l = st(i);
	int r = dr(i);
	int maxim, aux;
	
	if ( l <= dim_heap && A[l] > A[i] )
		maxim = l;
	else maxim = i;
	if ( r <= dim_heap && A[r] > A[maxim] )
		maxim = r;
	if ( maxim != i )
	{
		aux = A[i];
		A[i] = A[maxim];
		A[maxim] = aux;

		ReBuildHeap( A, maxim );
	}
}