Pagini recente » Cod sursa (job #6399) | Cod sursa (job #2666228) | Cod sursa (job #2314870) | Cod sursa (job #928799) | Cod sursa (job #278267)
Cod sursa(job #278267)
/*
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 );
}
}