您的位置:首页 > 理论基础 > 数据结构算法

【数据结构基础】最大堆的基本操作

2017-05-09 21:01 309 查看
堆:特殊的“队列”,取出元素的顺序按元素的优先权大小。

#include<stdio.h>
#include<stdlib.h>
#define MaxData 1000
#define Maxsize 100
typedef int bool;
typedef  struct HeapStruct{
int *Data;
int size;//当前大小
int Capacity;//最大容量
}*Heap;
Heap InitHeap(int size){
int i;
Heap H=(Heap)malloc(sizeof(struct HeapStruct));
H->size=0;
H->Capacity=Maxsize;
H->Data=(int*)malloc((size+1)*sizeof(int));
H->Data[0]=MaxData;
for(i=1;i<=size;i++){
scanf("%d",&H->Data[i]);
H->size++;
}
return H;
}
void PreDown(Heap H,int p){
int Parent, Child;
int X;
X = H->Data[p]; /* 取出根结点存放的值 */
for(Parent=p;Parent*2<=H->size;Parent=Child) {
Child = Parent * 2;
if( (Child!=H->size) && (H->Data[Child]<H->Data[Child+1]) )
Child++;  /* Child指向左右子结点的较大者 */
if( X >= H->Data[Child] ) break; /* 找到了合适位置 */
else  /* 下滤X */
H->Data[Parent] = H->Data[Child];
}
H->Data[Parent] = X;
}
//创建最大堆
Heap BuildMaxHeap(Heap H){
int i;
for(i=H->size/2;i>0;i--){
PreDown(H,i);
}
return H;
}
//判满
bool IsFull(Heap H){
return (H->Capacity==H->size);
}
//判空
bool IsEmpty(Heap H){
return (H->size == 0);
}
Heap Insert(Heap H,int item){
int i;
if(IsFull(H)){
printf("最大堆已满!");
return;
}
i=++H->size;
for(;H->Data[i/2]<item;i/=2){
H->Data[i]=H->Data[i/2];
}
H->Data[i]=item;
return H;
}
Heap DeleteMax(Heap H){
int Maxitem,temp,Parent,Child;
if(IsEmpty(H)){
printf("最大堆已空!");
return NULL;
}
Maxitem=H->Data[1];
printf("\n%d\n",Maxitem);
temp=H->Data[H->size--];
for(Parent=1;Parent*2<=H->size;Parent=Child){
Child=Parent*2;
if(Child!=H->size && H->Data[Child]<H->Data[Child+1]){
Child++;
}
if(temp>=H->Data[Child]) break;
else{
H->Data[Parent]=H->Data[Child];
}
}
H->Data[Parent] = temp;
return H;
}
void PrintHeap(Heap H){
int i;
for(i=1;i<=H->size;i++){
printf("%d ",H->Data[i]);
}
}
int main(void){
Heap H;
int size;
while(~scanf("%d",&size)){
H=InitHeap(size);
H=BuildMaxHeap(H);
PrintHeap(H);
H=Insert(H,77);
printf("\n");
PrintHeap(H);
H=DeleteMax(H);
printf("\n");
PrintHeap(H);
}
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息