Pagini recente » Cod sursa (job #730868) | Cod sursa (job #730880) | Cod sursa (job #1279393)
# include <stdio.h>
# define InFile "algsort.in"
# define OutFile "algsort.out"
# define dim 500000
int v[dim],n;
/*
Parinte = (i-1)/2;
FiuStanga = 2i+1;
FiuDreapta = 2i+2;
*/
void swap( int *x, int *y )
{
int aux = *x;
*x = *y;
*y =aux;
}
void Citire()
{
int i;
scanf("%d",&n);
for( i = 0 ; i < n ; ++i )
scanf("%d",v+i);
}
void Afisare()
{
int i;
for( i = 0 ; i < n ; ++i )
printf("%d ",v[i]);
}
void MaxHeap( int v[dim], int start, int end )
{
/*
start = ultimul parinte
end = fiul din dreapta al ultimului parinte
*/
int rad = start,fiu,caut;
while( rad*2+1 <= end )
// Cat timp parintele are cel putin un fiu
{
fiu = rad*2+1; // fiul din stanga
caut = rad; // caut un fiu mai mare decat tatal
if( v[caut] < v[fiu] )
caut = fiu;
if( fiu+1 <= end && v[caut] < v[fiu+1] )
caut = fiu+1;
if( caut != rad )
{
swap(v+caut,v+rad);
rad = caut;
}
else
return;
}
}
void CreareHeap( int v[dim], int n )
{
int ultim = ((n-1)-1)/2;
while( ultim >= 0 )
{
MaxHeap(v,ultim,n-1);
--ultim;
}
}
void HeapSort( int v[dim], int n )
{
CreareHeap(v,n);
int ultim = n-1;
while( ultim > 0 )
{
swap(v+ultim,v);
--ultim;
MaxHeap(v,0,ultim);
}
}
int main()
{
freopen(InFile,"r",stdin);
freopen(OutFile,"w",stdout);
Citire();
HeapSort(v,n);
Afisare();
fclose(stdin);
fclose(stdout);
return 0;
}