学习数据结构的记录,未完待续。。。。
一、最大-最小堆
1.定义
最小-最大堆是一个满足一下性质的完全二叉树:该二叉树不为空,二叉树的各层交替为最大层与最小层,且根结点为最小层。如果x位于最小层,则x是以x为根节点的子二叉树中的最小值。如果x位于最大层,则x是以x为根节点的子二叉树中的最大值。
以上是具有12个元素的最小-最大堆
2.最大-最小堆插入
当要插入新的元素 j 时
有四种情况:
(1)当 j.parent 是最小层:
1. 当 j 〉=j.parent 时,只需 在最大层执行简单的维护堆的操作。
2.当 j 〈 j . parent 是,将j 与 j.parent 调换,然后在最小堆上执行维护堆的操作
(2)当 j.parent 是最大层:
1. 当 j 〉= j.parent 时,将j 与 j.parent 调换,然后在最大堆上执行维护堆的操作
2.当 j 〈 j . parent 是,只需 在最小层执行简单的维护堆的操作。
代码如下:
#define MAX_SIZE 100 /* maximum size of heap plus 1 */
#define false 0
#define true 1
#define SWAP( x, y, t ) ( ( t ) = ( x ), ( x ) = ( y ), ( y ) = ( t ) )
typedef struct{
int key;
/* other fields */
}element;
element heap[MAX_SIZE];
bool level( int i ){
// if i is max return true
// else return false
int temp;
temp = (int)( log10( i ) / log10( 2 ) ) + 1;
if( temp % 2 ){
return false;
}else{
return true;
}
}
void max_min_insert( element heap[], int *n, element item ){
/* insert item into max_min heap */
int parent;
(*n)++;
if( *n == MAX_SIZE ){
//.....
exit( 1 );
}
parent = (*n) / 2;
if( !parent ){
heap[1] = items;
}else{
switch (level(parent)){
case false ://min level
if( item.key < heap[parent].key ){
heap[*n] = heap[parent];
verify_min( heap, parent, item );
}else{
verify_max( heap, *n, item );
}
break;
case true ://min level
if( item.key > heap[parent].key ){
heap[*n] = heap[parent];
verify_max( heap, parent, item );
}else{
verify_min( heap, *n, item );
}
default:
break;
}
}
}
void verify_max( element heap[], int i, element item ){
/* follow the nodes from the max node i to the root and insert item into its proper place */
int grandparent = i / 4;
while( grandparent ){
if( heap[grandparent].key < item.key ){
heap[i] = heap[grandparent];
i = grandparent;
grandparent /= 4;
}else{
break;
}
}
heap[i] = item;
}
void verify_min( element heap[], int i, element item ){
/* follow the nodes from the min node i to the root and insert item into its proper place */
int grandparent = i / 4;
while( grandparent ){
if( heap[grandparent].key > item.key ){
heap[i] = heap[grandparent];
i = grandparent;
grandparent /= 4;
}else{
break;
}
}
heap[i] = item;
}