数据结构-5 堆的定义与操作
来源:互联网 发布:2017低价备案域名交易 编辑:程序博客网 时间:2024/06/03 11:16
/* 堆的定义与操作 *//* 堆的数据结构 */typedef struct HeapNode *Heap;struct HeapNode { ElementType *Data; // 存储元素的数组 int Size; // 堆中当前元素个数 int Capacity; // 堆的最大容量};typedef Heap MaxHeap; // 最大堆#define MAXDATA 100000; // 大于最大堆中的所有元素值/* 创建最大容量为MaxSize的最大空堆 */MaxHeap CreateMaxHeap(int MaxSize) { MaxHeap H = (MaxHeap)malloc(sizeof(struct HeapNode)); H->Data = (ElementType *)malloc((MaxSize + 1) * sizeof(ElementType)); H->Size = 0; H->Capacity = MaxSize; H->Data[0] = MAXDATA; // 创建“哨兵”节点 return H;}/* 判断当前最大堆是否已满 */int IsFull(MaxHeap H) { return (H->Size == H->Capacity);}/* 判断当前最大堆是否为空 */int IsEmpty(MaxHeap H) { return (H->Size == 0);}/* 将元素X插入最大堆H,其中H->Data[0]已经定义为哨兵 */void InsertItem(MaxHeap H, ElementType Item) { int position; if (IsFull(H)) { printf("最大堆已满,无法插入!\n"); return; } position = ++H->Size; /* 插入后堆中最后一个元素的位置 */ while ((position /= 2) && (H->Data[position / 2] < Item)) { H->Data[position] = H->Data[position / 2]; } H->Data[position] = Item; return;}/* 从最大堆H中取出键值为最大的元素,并删除一个结点 */ElementType DeleteMax(MaxHeap H) { /* 用最大堆中最后一个元素从根结点开始向上过滤下层结点 */ int parent, child; ElementType maxItem, temp; if (IsEmpty(H)) { printf("最大堆已为空!"); return -1; } maxItem = H->Data[1]; temp = H->Data[H->Size--];/*取出删除前最大堆中的最后一个元素*/ for (parent = 1; parent * 2 <= H->Size; parent++) { child = parent * 2; if ((child != H->Size) && (H->Data[child] < H->Data[child + 1])) child++; if (H->Data[child] > temp) H->Data[parent] = H->Data[child]; else break; } H->Data[parent] = temp; return maxItem;}/*----------- 建造最大堆 -----------*/void PercDown(MaxHeap H, int p){ /* 下滤:将H中以H->Data[p]为根的子堆调整为最大堆 */ int Parent, Child; ElementType 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;}void BuildHeap(MaxHeap H){ /* 调整H->Data[]中的元素,使满足最大堆的有序性 */ /* 这里假设所有H->Size个元素已经存在H->Data[]中 */ int i; /* 从最后一个结点的父节点开始,到根结点1 */ for (i = H->Size / 2; i>0; i--) PercDown(H, i);}
阅读全文
0 0
- 数据结构-5 堆的定义与操作
- 数据结构之堆的定义
- 算法与数据结构-堆的基本操作C语言实现
- 算法与数据结构-堆的基本操作C语言实现
- 数据结构——串的定义与基本操作
- 数据结构(5)--栈的定义以及相关操作的实现
- 【数据结构基础】最大堆的基本操作
- 浙江大学 数据结构—堆的操作
- 【数据结构】堆的创建以及其他操作!!!
- 堆和栈的定义与区别
- 堆和栈的定义与区别
- 数据结构基础5.4:堆(HEAP)的基本操作(插入与删除)
- 【数据结构】堆与堆排序
- 数据结构之堆与栈的区别
- 【数据结构】最大堆的插入与删除
- 栈的定义与操作
- 堆与堆排序、二叉堆定义、对的插入与删除
- 堆与堆排序、二叉堆定义、对的插入与删除
- 数字证书原理,公钥私钥加密原理
- matlab与python
- 设计模式之禅笔记-解释器模式
- 浅谈Java中的hashcode方法
- hdu 3501 欧拉的和(≤N且与N互质的数的和
- 数据结构-5 堆的定义与操作
- 第九章 IO流
- ReactNative之ListView
- python nltk库的安装和简单使用
- Linux查看端口占用
- 简单实现Java消息队列之activemq
- Web入门(一)
- 安装beautifuSoup
- 优达学城Numpy与Pandas笔记