热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

删除最小堆的最小值

#include<stdio.h>#include<stdlib.h>#defineMAXSIZE20#defineOK1#defineERROR0
#include
#include
#define MAXSIZE 20
#define OK 1
#define ERROR 0

typedef int Status;
typedef int ElemType;

typedef struct
{
ElemType heapArray[MAXSIZE];
int length;
}MinHeap;

//对数组进行元素的输入
Status Init_heapArray(MinHeap * M,int Number)
{
ElemType data;
for(int i=0;i {
scanf("%d",&data);
M->heapArray[i]=data;
M->length++;
}
return OK;
}



//最小堆的初始化
Status Init_MinHeap(MinHeap * M)
{
int Number;
M->length=0;
printf("请输入数组的元素个数:\n");
scanf("%d",&Number);
printf("请输入%d个数据:\n",Number);
Init_heapArray(M,Number);
return OK;
}



int MinHeap_Leftchild(int pos) //返回左孩子的下标
{
return 2*pos+1;
}


int MinHeap_Rightchild(int pos) //返回右孩子的下标
{
return 2*pos+2;
}


int MinHeap_Parent(int pos) //返回双亲的下标
{
return (pos-1)/2;
}



void MinHeap_SiftDown(MinHeap * M,int left)
{
int i=left; //标识父结点
int j=MinHeap_Leftchild(i); //用于记录关键值较小的子结点
ElemType temp=M->heapArray[i]; //保存父结点
while(jlength) //过筛
{
if((jlength-1)&&(M->heapArray[j]>M->heapArray[j+1])) //若有右子结点,且小于左子结点
{
j++; //j指向右子结点
}
if(temp>M->heapArray[j]) //如果父结点大于子结点的值则交换位置
{
M->heapArray[i]=M->heapArray[j];
i=j;
j=MinHeap_Leftchild(j);
}
else //堆序性满足时则跳出
{
break;
}
}
M->heapArray[i]=temp;
}


//建立最小堆
void Create_MinHeap(MinHeap * M)
{
for(int i=M->length/2-1;i>=0;i--)
{
MinHeap_SiftDown(M,i);
}
}



void MinHeap_SiftUp(MinHeap * M,int position) //从position开始向上调整
{
int temppos=position;
ElemType temp=M->heapArray[temppos]; //记录当前元素
while((temppos>0) && (M->heapArray[MinHeap_Parent(temppos)]>temp)) //temppos>0,结束于根结点
{
M->heapArray[temppos]=M->heapArray[MinHeap_Parent(temppos)];
temppos=MinHeap_Parent(temppos);
}
M->heapArray[temppos]=temp;
}


void Swap(MinHeap * M,ElemType data1,ElemType data2)
{
ElemType temp;
temp=M->heapArray[data1];
M->heapArray[data1]=M->heapArray[data2];
M->heapArray[data2]=temp;
}

Status MinHeap_Delete(MinHeap * M)
{
if(M->length==0)
{
printf("不能删除,堆已空!\n");
return ERROR;
}
else
{
Swap(M,0,--M->length);
if(M->length>1)
{
MinHeap_SiftDown(M,0);
}
}
}



//输出元素
void Print(MinHeap * M)
{
for(int i=0;ilength;i++)
{
printf("%d ",M->heapArray[i]);
}
printf("\n");
}


int main()
{
MinHeap M;
Init_MinHeap(&M);
printf("输出先前元素:\n");
Print(&M);
Create_MinHeap(&M);
printf("输出最小堆的元素:\n");
Print(&M);
printf("删除最小堆里的最小值:\n");
MinHeap_Delete(&M);
printf("输出删除后的元素:\n");
Print(&M);
return 0;
}

这里写图片描述


推荐阅读
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本实验主要探讨了二叉排序树(BST)的基本操作,包括创建、查找和删除节点。通过具体实例和代码实现,详细介绍了如何使用递归和非递归方法进行关键字查找,并展示了删除特定节点后的树结构变化。 ... [详细]
  • 本文详细介绍了C语言中链表的两种动态创建方法——头插法和尾插法,包括具体的实现代码和运行示例。通过这些内容,读者可以更好地理解和掌握链表的基本操作。 ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • 本题涉及一棵由N个节点组成的树(共有N-1条边),初始时所有节点均为白色。题目要求处理两种操作:一是改变某个节点的颜色(从白变黑或从黑变白);二是查询从根节点到指定节点路径上的第一个黑色节点,若无则输出-1。 ... [详细]
  • 本题通过将每个矩形视为一个节点,根据其相对位置构建拓扑图,并利用深度优先搜索(DFS)或状态压缩动态规划(DP)求解最小涂色次数。本文详细解析了该问题的建模思路与算法实现。 ... [详细]
  • 使用GDI的一些AIP函数我们可以轻易的绘制出简 ... [详细]
  • ImmutableX Poised to Pioneer Web3 Gaming Revolution
    ImmutableX is set to spearhead the evolution of Web3 gaming, with its innovative technologies and strategic partnerships driving significant advancements in the industry. ... [详细]
author-avatar
林海书6758
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有