堆的初始化
void HeapInit ( HP* php)
{
assert ( php) ;
php-> a= NULL ;
php-> capacity= php-> size= 0 ;
}
堆的打印
void HeapPrint ( HP* php)
{
assert ( php) ;
for ( int i = 0 ; i < php-> size; i++ )
{
printf ( "%d " , php-> a[ i] ) ;
}
printf ( "\n" ) ;
}
堆的销毁
void HeapDestroy ( HP* php)
{
assert ( php) ;
free ( php-> a) ;
php-> a= NULL ;
php-> size= php-> capacity= 0 ;
}
堆的插入
void HeapPush ( HP* php, HPDataType x)
{
assert ( php) ;
if ( php-> size== php-> capacity)
{
int newCapacity= php-> capacity== 0 ? 4 : php-> capacity* 2 ;
HPDataType* tmp= ( HPDataType* ) realloc ( php-> a, sizeof ( HPDataType) * newCapacity) ;
if ( tmp == NULL )
{
perror ( "realloc fail" ) ;
exit ( - 1 ) ;
}
php-> a= tmp;
php-> capacity= newCapacity;
}
php-> a[ php-> size] = x;
php-> size++ ;
AdjustUP ( php-> a, php-> size- 1 ) ;
}
向上调整接口
void AdjustUP ( HPDataType* a, int child)
{
int parent = ( child- 1 ) / 2 ;
while ( child> 0 )
{
if ( a[ child] > a[ parent] )
{
Swap ( & a[ child] , & a[ parent] ) ;
child= parent;
parent= ( child- 1 ) / 2 ;
}
else
{
break ;
}
}
}
堆的元素删除
void HeapPop ( HP* php)
{
assert ( php) ;
assert ( php-> size> 0 ) ;
Swap ( & php-> a[ 0 ] , & php-> a[ php-> size- 1 ] ) ;
php-> size-- ;
AdjustDown ( php-> a, php-> size, 0 ) ;
}
向下调整接口
void AdjustDown ( HPDataType* a, int n, int parent)
{
int child = parent* 2 + 1 ;
while ( child< n)
{
if ( ( child+ 1 ) < n && a[ child] < a[ child+ 1 ] )
{
++ child;
}
if ( a[ parent] < a[ child] )
{
Swap ( & a[ parent] , & a[ child] ) ;
parent= child;
child= parent* 2 + 1 ;
}
else
{
break ;
}
}
}
测试
void TestHeap ( )
{
int array[ ] = { 27 , 15 , 19 , 18 , 28 , 34 , 65 , 49 , 25 , 37 } ;
HP hp;
HeapInit ( & hp) ;
for ( int i= 0 ; i< sizeof ( array) / sizeof ( int ) ; i++ )
{
HeapPush ( & hp, array[ i] ) ;
}
HeapPrint ( & hp) ;
HeapDestroy ( & hp) ;
}