【数据结构基础】最大堆的基本操作
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; }
相关文章推荐
- (大数据工程师学习路径)第一步 Linux 基础入门----目录结构及文件基本操作
- hrbustoj 1545:基础数据结构——顺序表(2)(数据结构,顺序表的实现及基本操作,入门题)
- 数据结构基础5.4:堆(HEAP)的基本操作(插入与删除)
- 数据结构基础(8) --单链表的设计与实现(1)之基本操作
- 【数据结构基础】二叉搜索(排序)树的基本操作
- 数据结构基础(8) --单链表的设计与实现(1)之基本操作
- 数据结构基础5.2:二叉搜索树(BST)的基本操作(插入、查找、删除)
- 数据结构基础(8) --单链表的设计与实现(1)之基本操作
- 数据结构基础(8) --单链表的设计与实现(1)之基本操作
- EntityFramework Core笔记:表结构及数据基本操作(2)
- redis实战基础篇:redis的5种数据类型的基本操作
- 数据结构基础(9) --单链表的设计与实现(2)之高级操作
- Hive基础(2): 数据类型、数据库、表、字段、交互式查询的基本操作
- 栈的基本操作-数据结构
- 数据结构基础——内存中数据存储的基本方式(单链表)
- 数据结构——栈的基本操作
- 数据结构之——栈的基本操作
- 数据结构之队列的基本操作入队出队初始化删除-c++代码实现及运行实例结果
- 数据结构—链表-单链表基本操作实现
- 数据结构——二叉树的基本操作