#define INIT_NUMBER 2
int reserve_number = 100;
int heap_size;
int length;
typedef struct pair
{
int key;
int value;
}PAIR,*PAIRPOINT;
//往最大优先队列中添加根结点
void MAX_HEAPIFY_ROOT(PAIR* A,int i)
{
int left=2*i+1;
int right=left+1;
int largest;
if(left<=heap_size&&A[left].key>A[i].key)
{
largest=left;
}
else
{
largest=i;
}
if(right<=heap_size&&A[right].key>A[largest].key)
{
largest=right;
}
if(largest!=i)
{
PAIR max;
max=A[largest];
A[largest]=A[i];
A[i]=max;
MAX_HEAPIFY_ROOT(A,largest);
}
}
往最大优先队列中添加叶子结点
void MAX_HEAPIFY_CHILD(PAIR* A,int i)
{
int parent=(i-1)/2;
int small;
if(parent>=0&&A[parent].key<=A[i].key)
{
small=parent;
}
else
{
small=i;
}
if(small!=i)
{
PAIR min;
min=A[parent];
A[parent]=A[i];
A[i]=min;
MAX_HEAPIFY_CHILD(A,small);
}
}
//创建最大优先队列
void BUILD_MAX_HEAP(PAIR* A)
{
heap_size=length;
for(int i=length/2;i>=0;--i)
{
MAX_HEAPIFY_ROOT(A,i);
}
}
//返回A中具有最大关键字的元素
PAIR MAXIMUM(PAIR *A)
{
if(heap_size<0)
exit(0);
return A[0];
}
//返回并删除A中具有最大关键字的元素
PAIR EXTRACT_MAX(PAIR *A)
{
if(heap_size<0)
{
printf("A为空\n");
//结束当前进程
exit(0);
}
else
{
PAIR max;
max=A[0];
A[0]=A[heap_size];
heap_size=heap_size-1;
MAX_HEAPIFY_ROOT(A,0);
return max;
}
}
//往最大优先队列中添加一个元素i
void INSERT(PAIR *A,PAIR i)
{
length=heap_size=heap_size+1;
if(heap_size>=reserve_number)
{
reserve_number=reserve_number+100;
A=(PAIR *)realloc(A,reserve_number*sizeof(PAIR));
}
if(!A)
{
printf("内存分配失败\n");
return ;
}
A[heap_size]=i;
MAX_HEAPIFY_CHILD(A,heap_size);
}
int _tmain(int argc, _TCHAR* argv[])
{
heap_size=length=INIT_NUMBER;
PAIR *A=(PAIR *)malloc((reserve_number)*sizeof(PAIR));
if(!A)
{
printf("内存分配失败\n");
return 1;
}
A[0].key=0;
A[0].value=-0;
A[1].key=1;
A[1].value=-1;
A[2].key=2;
A[2].value=-2;
BUILD_MAX_HEAP(A);
PAIR x;
x.key=8;
x.value=10;
INSERT(A,x);
for(int i=0;i<4;++i)
{
printf("%d\n",EXTRACT_MAX(A));
}
free(A);
system("pause");
return 0;
}