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

c语言实现最大堆

以我实现的经验来看,还是快点学会c吧,c语言来写的话,太复杂了。。。注意点我都标记在了代码里,然后,想提醒自己

以我实现的经验来看,还是快点学会c++吧,c语言来写的话,太复杂了。。。注意点我都标记在了代码里,然后,想提醒自己一下,插入是,调整堆,是循环上移;删除时,调整堆,是循环下移

这里由于初次学习,就先将二叉堆不打印成树的形状,只是以数组的形式输出,等进阶了,再来思考一下

//c语言实现一个最大堆. 堆从数组的下标为1的部分开始存储
//写的时候不得不感叹,还是c++强大啊,真的更安全了#include
#include
#include
#include#define INIT_SIZE 100
#define INCREASE_SIZE 10
#define true 1
#define false 0typedef struct
{int* data; //实现一个可以动态扩展容量的堆int size; //堆内元素的个数int capacity;}Maxheap;void swap(int * a,int *b)
{int temp;temp = *a;*a = *b;*b = temp;
}void Init_Maxheap(Maxheap* max_heap)
{max_heap->data = (int*)malloc( INIT_SIZE * sizeof(int) );assert(max_heap->data);max_heap->size = 0;max_heap->capacity = INIT_SIZE;}int Is_Empty(Maxheap max_heap)
{return max_heap.size == 0 ? true : false;}//这里的循环要理解 曾经写错过
void Insert_Maxheap(Maxheap* max_heap,int e)
{//先判断数组空间是否够if(max_heap->size +1 > INIT_SIZE){//注意 realloc写法max_heap->data = (int*)realloc(max_heap->data,(INIT_SIZE + INCREASE_SIZE) *sizeof(int));assert(max_heap->data);max_heap->capacity += INCREASE_SIZE;}//不要忘记改变size的值啊,因为就是通过它来访问堆max_heap->size ++;int j = max_heap->size;max_heap->data[j] = e;//将插入的元素上移的过程//这里是while 而不是if 有索引就要考虑越界。注意这是一个循环上移的过程while( j > 1 && max_heap->data[ j/2 ] data[j]) //注意这里不能写e哦,因为循环每一次这个值都是改变的{swap(&max_heap->data[j/2],&max_heap->data[j]); j = j/2;}}//这里的循环要理解 曾经写错过。注意这是一个循环下移的过程
int Extract_Maxheap(Maxheap* max_heap)
{assert(max_heap->size > 0);int ret &#61; max_heap->data[1];//这里我们让最后一个元素直接赋值到第一个元素&#xff0c;然后size-- 下一次插入元素的时候就直接将其覆盖即可max_heap->data[1] &#61; max_heap->data[max_heap->size]; //可以看出来用c来写有点麻烦啊max_heap->size --;//然后来从上到下调整堆//当它没有孩子的时候就不循环了 由于是从上往下的&#xff0c;每一次父节点值会有所变化&#xff0c;其初始值为1int k &#61; 1;while(k * 2 <&#61; max_heap->size ) //有左孩子就证明有孩子{//看它是否有右孩子 并比较左右孩子值的大小int exchange &#61; 2 * k;if(exchange &#43; 1 <&#61; max_heap->size && max_heap->data[exchange&#43;1] > max_heap->data[exchange])exchange &#43;&#61; 1;//这个思考漏掉了if(max_heap->data[k] > max_heap->data[exchange])break;swap(&max_heap->data[k],&max_heap->data[exchange]);k &#61; exchange; //注意这里要更改变化}return ret;
}void Print_Maxheap(Maxheap max_heap)
{for(int i &#61; 1; i <&#61; max_heap.size;i&#43;&#43;){printf("%d ",max_heap.data[i]);}printf("\n");
}int main(int argc, char const *argv[])
{Maxheap max_heap;Init_Maxheap(&max_heap);srand(time(NULL));for(int i &#61; 0; i <15 ; i&#43;&#43;)Insert_Maxheap(&max_heap,rand()%100);Print_Maxheap(max_heap);while(!Is_Empty(max_heap))printf("%d ", Extract_Maxheap(&max_heap));printf("\n");return 0;
}

在这里插入图片描述


推荐阅读
  • 2018 HDU 多校联合第五场 G题:Glad You Game(线段树优化解法)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6356在《Glad You Game》中,Steve 面临一个复杂的区间操作问题。该题可以通过线段树进行高效优化。具体来说,线段树能够快速处理区间更新和查询操作,从而大大提高了算法的效率。本文详细介绍了线段树的构建和维护方法,并给出了具体的代码实现,帮助读者更好地理解和应用这一数据结构。 ... [详细]
  • 单链表的高效遍历及性能优化策略
    本文探讨了单链表的高效遍历方法及其性能优化策略。在单链表的数据结构中,插入操作的时间复杂度为O(n),而遍历操作的时间复杂度为O(n^2)。通过在 `LinkList.h` 和 `main.cpp` 文件中对单链表进行封装,我们实现了创建和销毁功能的优化,提高了单链表的使用效率。此外,文章还介绍了几种常见的优化技术,如缓存节点指针和批量处理,以进一步提升遍历性能。 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • MSP430F5438 ADC12模块应用与学习心得
    在最近的实践中,我深入研究了MSP430F5438的ADC12模块。尽管该模块的功能相对简单,但通过实际操作,我对MSP430F5438A和MSP430F5438之间的差异有了更深刻的理解。本文将分享这些学习心得,并探讨如何更好地利用ADC12模块进行数据采集和处理。 ... [详细]
  • 在C语言中,指针的高级应用及其实例分析具有重要意义。通过使用 `&` 符号可以获取变量的内存地址,而 `*` 符号则用于定义指针变量。例如,`int *p;` 定义了一个指向整型的指针变量 `p`。其中,`p` 代表指针变量本身,而 `*p` 则表示指针所指向的内存地址中的内容。此外,指针在不同函数中可以具有相同的变量名,但其作用域和生命周期会有所不同。指针的灵活运用能够有效提升程序的效率和可维护性。 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • 在C语言程序开发中,调试和错误分析是确保代码正确性和效率的关键步骤。本文通过一个简单的递归函数示例,详细介绍了如何编写和调试C语言程序。具体而言,我们将创建一个名为 `factorial.c` 的文件,实现计算阶乘的功能,并通过逐步调试来分析和解决可能出现的错误。此外,文章还探讨了常见的调试工具和技术,如GDB和断点设置,以帮助开发者高效地定位和修复问题。 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • 全局变量与常量在内存中的布局分析及应用
    本文详细探讨了全局变量与常量在内存中的存储布局及其应用。通过分析不同编译器和操作系统对全局变量与常量的处理方式,揭示了它们在内存中的具体分配机制。此外,文章还讨论了这些布局对程序性能和安全的影响,并提供了优化建议,帮助开发者更好地理解和利用全局变量与常量的内存管理。 ... [详细]
  • 经过两天的努力,终于成功解决了半平面交模板题POJ3335的问题。原来是在`OnLeft`函数中漏掉了关键的等于号。通过这次训练,不仅加深了对半平面交算法的理解,还提升了调试和代码实现的能力。未来将继续深入研究计算几何的其他核心问题,进一步巩固和拓展相关知识。 ... [详细]
  • NOIP2000的单词接龙问题与常见的成语接龙游戏有异曲同工之妙。题目要求在给定的一组单词中,从指定的起始字母开始,构建最长的“单词链”。每个单词在链中最多可出现两次。本文将详细解析该题目的解法,并分享学习过程中的心得体会。 ... [详细]
  • 洛谷 P4035 [JSOI2008] 球形空间生成器(高斯消元法 / 模拟退火算法)
    本文介绍了洛谷 P4035 [JSOI2008] 球形空间生成器问题的解决方案,主要使用了高斯消元法和模拟退火算法。通过这两种方法,可以高效地求解多维空间中的球心位置。文章提供了详细的算法模板和实现代码,适用于 ACM 竞赛和其他相关应用场景。数据范围限制在 10 以内,确保了算法的高效性和准确性。 ... [详细]
  • 解题心得:UVA1339(逻辑分析与字符串处理+排序算法)
    解题心得:UVA1339(逻辑分析与字符串处理+排序算法) ... [详细]
  • Codeforces 605C:Freelancer's Dreams —— 凸包算法解析与题解分析 ... [详细]
  • 在洛谷 P1344 的坏牛奶追踪问题中,第一问要求计算最小割,而第二问则需要找到割边数量最少的最小割。通过为每条边附加一个单位权值,可以在求解最小割时优先选择边数较少的方案,从而同时解决两个问题。这种策略不仅简化了问题的求解过程,还确保了结果的最优性。 ... [详细]
author-avatar
手机用户2602890485
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有