大根堆的删除c语言,大根堆和小根堆的C语言实现

大根堆小根堆的实现:以PPT形式呈现大根堆构建的理论过程

1、首先涉及到一个堆的调整,这也是算法的核心部分。假设树中,节点i的子树已经为两个大根堆。这两个子树再加上i节点的话,可能是大根堆也可能不是,因此需要对节点i进行调整。若i小于left(i) or right(i),需要将i下移。

0818b9ca8b590ca3270a3433284dd417.png

2、这是一个例子,需要将4下移。满足大根堆的性质。

0818b9ca8b590ca3270a3433284dd417.png

3、大根堆的调整算法。假设i节点的两个子树已经是大根堆。对应代码中MaxHeapify()函数。

0818b9ca8b590ca3270a3433284dd417.png

4、算法正确性分析。

0818b9ca8b590ca3270a3433284dd417.png

5、构建大根堆的过程中,只需要考虑n/2 + 1 之前的节点,因为之后的节点都是叶节点。

0818b9ca8b590ca3270a3433284dd417.png

6、构建大根堆的算法。对应代码中MaxHeapCreat()函数

0818b9ca8b590ca3270a3433284dd417.png

#include

#include

#include

#include

#include

/*

目的:建立大根堆,也可以变成小根堆,

核心:堆的调整

输入:一系列来自文件的整数。文件中整数以空格隔开

输出:大根堆

*/

void Swap(uint32_t* array, uint32_t i, uint32_t j)

{

assert(array);

uint32_t tmp;

tmp = array[j];

array[j] = array[i];

array[i] = tmp;

}

/*大根堆调整*/

void MaxHeapify(uint32_t* array, uint32_t heapSize, uint32_t currentNode)

{

uint32_t leftChild, rightChild, largest;

leftChild = 2*currentNode + 1;

rightChild = 2*currentNode + 2;

if(leftChild < heapSize && array[leftChild] > array[currentNode])

largest = leftChild;

else

largest = currentNode;

if(rightChild < heapSize && array[rightChild] > array[largest])

largest = rightChild;

if(largest != currentNode)

{

Swap(array, largest, currentNode);

MaxHeapify(array, heapSize, largest);

}

}

/*构建大根堆*/

void MaxHeapCreat(uint32_t* array, uint32_t heapSize)

{

int i;

for(i = heapSize/2; i >= 0; i--)

{

MaxHeapify(array, heapSize, i);

}

}

/*小根堆调整*/

void MinHeapify(uint32_t* array, uint32_t heapSize, uint32_t currentNode)

{

uint32_t leftChild, rightChild, minimum;

leftChild = 2*currentNode + 1;

rightChild = 2*currentNode + 2;

if(leftChild < heapSize && array[leftChild] < array[currentNode])

minimum = leftChild;

else

minimum = currentNode;

if(rightChild < heapSize && array[rightChild] < array[minimum])

minimum = rightChild;

if(minimum != currentNode)

{

Swap(array, minimum, currentNode);

MinHeapify(array, heapSize, minimum);

}

}

/*构建小根堆*/

void MinHeapCreat(uint32_t* array, uint32_t heapSize)

{

int i;

for(i = heapSize/2; i >= 0; i--)

{

MinHeapify(array, heapSize, i);

}

}

int main()

{

uint32_t tmp;

uint32_t *array;

array = malloc(sizeof(uint32_t));

int i, heapSize = 0;

/*从文件中读出待排序数据*/

char* filePathway = "C:/Users/Administrator/Desktop/data.txt";

FILE* fp;

fp = fopen(filePathway, "rb");

if(!fp)

{

fprintf(stderr, "Can not open file correctly\n");

}

while(!feof(fp))

{

fscanf(fp, "%d", &tmp);

heapSize++;

array = realloc(array, sizeof(uint32_t) * (heapSize ));

if(array == NULL)

{

fprintf(stderr, "realloc error!\n");

return 1;

}

array[heapSize - 1] = tmp;

}

printf("The origen dataset:\n");

for(i = 0; i < heapSize; i++)

{

printf("%d\t", array[i]);

}

printf("\n");

/*构建小根堆并输出*/

MinHeapCreat(array, heapSize);

printf("Output the MinHeap:\n");

for(i = 0; i < heapSize; i++)

{

printf("%d\t", array[i]);

}

printf("\n");

/*构建大根堆并输出*/

MaxHeapCreat(array, heapSize);

printf("Output the MaxHeap:\n");

for(i = 0; i < heapSize; i++)

{

printf("%d\t", array[i]);

}

free(array);

fclose(fp);

return 0;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/369392.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java数据结构学习笔记之一】线性表的存储结构及其代码实现

应用程序后在那个的数据大致有四种基本的逻辑结构&#xff1a; 集合&#xff1a;数据元素之间只有"同属于一个集合"的关系 线性结构&#xff1a;数据元素之间存在一个对一个的关系 树形结构&#xff1a;数据元素之间存在一个对多个关系 图形结构或网状结构&#xff…

分析Java核心转储

在本文中&#xff0c;我将向您展示如何调试Java核心文件&#xff0c;以查看导致JVM崩溃的原因。 我将使用在上一篇文章&#xff1a; 生成Java Core Dump中生成的核心文件。 您可以通过以下几种方法来诊断JVM崩溃&#xff1a; hs_err_pid日志文件 当JVM中发生致命错误时&#x…

网页结构 盒模型

HTML是个什么鬼&#xff1f; 前端开发人员要想和浏览器沟通&#xff0c;就要用到浏览器才能够识别的语言&#xff08;HTML超文本标记语言&#xff09;&#xff0c;所以他是一门浏览器能够识别的语言。是一种由标签组成的超文本标记语言&#xff0c;而非编程语言。一个html文档…

idea创建git分支

此时只是在本地创建好了分支&#xff0c;修改源代码后add&#xff0c;commit将本地分支提交到远程仓库分支已创建&#xff0c;其它成员此时就可以从git拉分支转载于:https://www.cnblogs.com/qianqiu-1026/p/8589218.html

已知华氏温度f c语言,编程题:已知两种温度的换算公式C=(5/9)(F-32),试编写一个程序输入华氏度F,输出摄氏度。...

使用python的写法为&#xff1a;valinput("请输入带有温度表示符号的温度值(例如&#xff1a;32c)")if val[-1] in ["C","c"]:f1.8*float(val[0:-1])32print("转换后的温度为&#xff1a;%.2fF"%f)elif val[-1] in ["F",&qu…

MongoDB身份验证

我最近更新了Mongometer &#xff0c;使其更加灵活。 发布新版本后不久&#xff0c;其中一位用户通过在帖子中发表评论来反馈问题。 我启动了我的机器&#xff0c;打开了我的IDE&#xff0c;发现了问题&#xff0c;并在半小时内将修复程序推送到了github 。 这不是快速的成功案…

golang ffmpeg 做网络直播

最近在公司做在线视频转码的工作&#xff0c;研究了下ffmpeg 最后直接研究了下网络直播&#xff0c;我是在我自己的mac 上面测试的&#xff0c;效果&#xff0c;还可以&#xff0c;先看看效果图吧 ffmpeg 我是通过brew安装 的&#xff0c;这步就略了 VLC这个播放器怎么安装的也…

androidstudio带pom的上传到jcenter_输送机@网带输送机@304网带输送机@304不锈钢网带输送机@输送机网带厂家定制...

输送机网带输送机食品网带输送机304网带输送机304不锈钢网带输送机输送机网带厂家定制输送机主要用于运输食品原料或成品。食品输送机根据输送带不同可分为皮带的&#xff0c;链板的&#xff0c;网带的。输送形式有&#xff1a;直行的&#xff0c;爬坡提升的&#xff0c;清洗的…

box-sizing -- 盒模型

项目开发中&#xff0c;在浏览同事的代码&#xff0c;发现他经常用一个属性--box-sizing&#xff0c;很好奇是什么&#xff0c;于是乎&#xff0c;上网查阅资料学了起来。  首先我们先复习一下盒模型的组成&#xff1a;一个div通常由 content(内容) margin padding border组成…

有温度传感器的风机控制系统C语言,毕业论文--基于单片机的工业风机控制器设计与实现.doc...

大连东软信息学院本科毕业设计(论文)论文题目论文题目&#xff1a;基于单片机的工业风机控制器设计与实现系 所&#xff1a;电子工程系专 业&#xff1a;电子信息工程(嵌入式系统工程方向)学生姓名&#xff1a;学生学号&#xff1a;指导教师&#xff1a;导师职称&#xff1a;讲…

JAXB和java.util.Map

具有讽刺意味的是&#xff0c;可能很难在JAXB&#xff08;JSR-222&#xff09;中映射java.util.Map类&#xff1f; 在这篇文章中&#xff0c;我将介绍一些使其变得更容易的项目。 Java模型 以下是我们将用于此示例的Java模型。 顾客 Customer类具有Map类型的属性。 我之所以…

转载大神的一篇文章----【如何选择开源许可证?】

原文地址&#xff1a;http://www.ruanyifeng.com/blog/2011/05/how_to_choose_free_software_licenses.html 如何为代码选择开源许可证&#xff0c;这是一个问题。 世界上的开源许可证&#xff0c;大概有上百种。很少有人搞得清楚它们的区别。即使在最流行的六种----GPL、BSD、…

教你如何用 lib-flexible 实现移动端H5页面适配

前话 好久没写教程了&#xff08;可能会误导新手的菜鸟教程(&#xffe3;▽&#xffe3;)"&#xff09;。 这是我的github&#xff0c;欢迎前端大大们和我一起学习交流 https://github.com/pwcong 最近入职公司做前端实习&#xff0c;这几个星期来学到了移动端H5页面适配…

使用GlassFish 3.1.2.2和Primefaces 3.4的JDBC领域和基于表单的身份验证

我的博客上最受欢迎的帖子之一是有关JDBC安全领域和带有Primefaces的GlassFish上基于表单的身份验证的简短教程。 在收到有关它不再适用于最新的GlassFish 3.1.2.2的评论后&#xff0c;我认为可能是时候重新访问它并提出更新的版本了。 开始了&#xff1a; 制备 就像在原始教程…

thinkcmf常用标签

1、图片地址&#xff1a;{:cmf_get_image_url($vo.icon)} 2、模板控件 模板变量调用&#xff1a;$theme_vars.title <widget name"aboutUs">{$widget.title} //控件标题 {$widget.vars.subTitle} //控件变量 subTitle {:nl2br($widget.vars.content)} //输…

esplise自定义快捷代码补全_【Eclipse】_Eclipse自动补全增强方法 常用快捷键

一&#xff0c;Eclipse自动补全增强方法在Eclipse中&#xff0c;从Window -> preferences -> Java -> Editor -> Content assist -> Auto-Activation下&#xff0c;我们可以在"."号后面加入我们需要自动提示的首字幕&#xff0c;比如"abc"&…

ubuntu下docker安装,配置python运行环境

参考自: 1.最详细ubuntu安装docker教程 2.使用docker搭建python环境 首先假设已经安装了docker&#xff0c;卸载原来的docker 在命令行中运行&#xff1a; sudo apt-get updatesudo apt-get remove docker docker-engine docker.io containerd runc 安装docker依赖 apt-get…

android前置拍照镜像代码,从Android的前置摄像头拍摄的镜像翻转视频

我有一个能够拍摄图像和录制视频的摄像头应用程序。但是&#xff0c;当从设备前置摄像头捕捉图像或录制视频时&#xff0c;结果会翻转&#xff0c;就像您在看镜子一样。我想再次翻转&#xff0c;所以看起来很正常。我设法与图像要做到这一点&#xff0c;通过使用Matrix翻转Bitm…

python 打造一个sql注入脚本 (一)

0x00前言&#xff1a; 昨天刚刚看完小迪老师的sql注入篇的第一章 所以有了新的笔记。 0x01笔记&#xff1a; sql注入原理&#xff1a; 网站数据传输中&#xff0c;接受变量传递的值未进行过滤&#xff0c;导致直接带入数据库查询执行的操作。 sql注入对渗透的作用&#xff1a; …

文档声明和HTML样式表

文档声明 不是注释也不是元素&#xff0c;总是在HTML的第一行 书写格式&#xff1a;<!DOCTYPE HTML> 是用于通知浏览器目前文档正使用哪一个HTML版本&#xff08;相关属性 lang&#xff09; 若不写文档声明&#xff0c;浏览器渲染页面时会进入怪异模式 HTML元素又叫根元素…