堆的操作实现—大根堆
2016-06-08 02:13
369 查看
程序中有一个BUG,插入函数有一点问题,替换出现问题,待改进!
// 堆的操作实现.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> #include<stdio.h> #include<malloc.h> #define MAXDATA 1000 #define Error -1 using namespace std; typedef int ElementType; typedef struct HNode *Heap; struct HNode { ElementType *Data; int Size; int Capactity; }; typedef Heap MaxHeap; typedef Heap MinHeap; MaxHeap CreateHeap(int MaxSize) {//创建容量为MaxSize的空的最大堆 MaxHeap H = (MaxHeap)malloc(sizeof(struct HNode)); H->Data = (ElementType *)malloc((MaxSize + 1)*sizeof(ElementType)); H->Size = 0; H->Capactity = MaxSize; H->Data[0] = MAXDATA; return H; } bool IsFull(MaxHeap H) { return (H->Size == H ->Capactity); } bool IsEmpty(MaxHeap H) { return (H->Size == 0); } void Insert(MaxHeap H, ElementType X) {// 将元素X插入最大堆H,其中H->Data[0]已经定义为哨兵 int i; if (IsFull(H)) { cout << "最大堆已满!" << endl; exit(1); } i = ++H->Size; H->Data[i] = X; for (; H->Data[i / 2] < H->Data[i]; i / 2) { int Temp = H->Data[i]; H->Data[i] = H->Data[i / 2]; H->Data[i / 2] =Temp; } } //堆实际上是完全二叉树 ElementType DeleteMax(MaxHeap H) {// 从最大堆H中取出键值为最大的元素,并删除一个结点 int Parent, Child; ElementType MaxItem, X; if (IsEmpty(H)) { cout << "最大堆已空!" << endl; return Error; } MaxItem = H->Data[1]; X = 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++;//Child始终指向左右孩子中的最大值 if (X >= H->Data[Child]) break; else H->Data[Parent] = H->Data[Child]; } H->Data[Parent] = X; 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 H->Data[Parent] = H->Data[Child]; } H->Data[Parent] = X; } void BuildHeap(MaxHeap H) { int i; //从最后一个结点的父节点开始,到根结点1 for (i = H->Size / 2; i>0; i--) PercDown(H, i); } void PrintHeap(MaxHeap H) { for (int i = 1; i < H->Size+1; i++) cout << H->Data[i] << " "; cout << endl; } int _tmain(int argc, _TCHAR* argv[]) { MaxHeap MHeap; int MaxSize; int Size; cout << "请输入堆中允许存放最多元素个数:"; cin >> MaxSize; MHeap = CreateHeap(MaxSize); cout << "请输入堆中元素个数:"; cin >> Size; for (int i =1; i < Size+1; i++) { cin >> MHeap->Data[i]; MHeap->Size++; } BuildHeap(MHeap); cout << "调整好的大根堆:" << endl; PrintHeap(MHeap); int Data; cout << "请输入要插入的元素:"; cin >> Data; Insert(MHeap, Data); cout << "插入后调整好的大根堆:" << endl; PrintHeap(MHeap); int Max = DeleteMax(MHeap); cout << "该大根堆的最大值是:" <<Max<< endl; cout << "删除最大值后调整好的大根堆:" << endl; PrintHeap(MHeap); return 0; }
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- 一看就懂:图解C#中的值类型、引用类型、栈、堆、ref、out
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- wma tag 批量修改[原代码-从wmfsdk中修改]
- 网站被黑后的处理方法及批量删除恶意代码
- 再谈反向链接,又学了东西
- 大家要经常更新内容啊-针对百度的原创收录速度测试
- jsp 定制标签(Custom Tag)
- DEDECMS TAG伪静态 IIS_rewrite配置方法附rewrite下载
- Java数据结构及算法实例:插入排序 Insertion Sort