您的位置:首页 > 其它

学习笔记-堆

2016-05-25 09:04 253 查看
#include<stdio.h>

#include<stdlib.h>

typedef struct Node

{

int*Elements;

intSize; //堆的长度

intCapacity; //堆的最大容量

}MinHeap;

//初始化一个堆

void Create(MinHeap *&H,int MaxSize)

{

H=(MinHeap*)malloc(sizeof(MinHeap));

H->Elements=(int*)malloc((MaxSize+1)*sizeof(int));

H->Size=0;

H->Elements[0]=-1; //0号位置不放数据,随便设置一个最小的数为哨兵

}

bool IsFull(MinHeap *H)

{

returnH->Size==H->Capacity;

}

//往堆里插入数据,其实可以直接在主程序里输入就行了

void Insert(MinHeap *&H,int data)

{

inti;

if(IsFull(H))

{

printf("man");

return;

}

H->Size++;

H->Elements[H->Size]=data;

}

//删除堆顶的数据(最小的一个数)先理解删除,创建一个堆和删除差不多



int Delete(MinHeap *H)

{

intparent,child;

if(!IsFull(H))

{

printf("kong");

return0;

}

intmin=H->Elements[1];

inttemp=H->Elements[H->Size];//找到堆的最后一个节点

H->Size--; //删去堆顶的元素

//查找temp应该插入的位置

for(parent=1;parent*2<=H->Size;parent=child)

{

child=parent*2;

if(child!=H->Size&&H->Elements[child]>H->Elements[child+1])//找到两个孩子节点中小的一个

child++;

if(temp<=H->Elements[child])//如果temp比该节点的孩子节点小,退出循环

break;

else

H->Elements[parent]=H->Elements[child];//否则该节点等于孩子节点(将孩子节点上移)

}

H->Elements[parent]=temp;//将temp插入该节点

returnmin;

}

//堆是一个完全二叉树,

//从第一个有孩子的节点开始,看它是不是堆,不是的话通过删除所用的方法将它调整为堆



void CreateHeap(MinHeap *&H)

{

intparent,child;

inti;

inttemp;

for(i=H->Size;i>0;i--)

{

if(2*i<=H->Size)//从倒数第一个有孩子的节点开始

{

temp=H->Elements[i];

for(parent=i;2*parent<=H->Size;parent=child)

{

child=parent*2;

if(child!=H->Size&&H->Elements[child]>H->Elements[child+1])

child++;

if(temp<=H->Elements[child])

break;

else

H->Elements[parent]=H->Elements[child];

}

H->Elements[parent]=temp;

}

}

}

int IsMinHeap(MinHeap *H)

{

inti;

intflag=1;

for(i=1;2*i<=H->Size;i++)

{

if(H->Elements[i]>H->Elements[2*i]||H->Elements[i]>H->Elements[2*i+1]&&(2*i+1)<H->Size)

flag=0;

}

returnflag;

}

int main()

{

intn;

scanf("%d",&n);

MinHeap*H;

Create(H,n);

intdata,i;

for(i=1;i<=n;i++)

{

scanf("%d",&data);

Insert(H,data);

}

if(IsMinHeap(H)==false)

printf("No");

else

printf("Yes");

system("PAUSE");

return 0;

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