当前位置: 首页 > news >正文

C语言手写堆|从定义到排序,一篇带你搞定所有接口!

一、定义一个堆

#pragma once typedef int HPDataType; #include<stdio.h> #include<stdlib.h> typedef struct Heap { //堆的本质是树 //要用数组存储 HPDataType* _a; int _size; int _capacity; }Heap;

二、常见接口

void HeapInit(Heap* php, HPDataType* a, int n); void HeapDEstory(Heap* php); void HeapPush(Heap* php, HPDataType x); void HeapPop(Heap* php); HPDataType HeapTop(Heap* php);

三、向下调整算法

//前提:左右子树都是小堆 void AdjustDown(HPDataType* a, int n,int root) { int parent = root; int child = parent * 2 + 1; while(child<n) { //1.找出左右孩子中小的那一个 // 因为不是换一下左右就完了 // 以后还要以这个孩子为根进行交换 //所以默认为左孩子 if (child+1<n && a[child + 1] < a[child]) child++; //2.如果小的那个孩子比父亲还小,就交换 if (a[child] < a[parent]) { Swap(&a[child], &a[parent]); parent = child; child = parent * 2 + 1; } else break; } }

四、初始化

void HeapInit(Heap* php, HPDataType* a, int n) { php->_a = (HPDataType*)malloc(sizeof(HPDataType) * n); //malloc很难失败 //此处省略检查,不过严谨起见,最好加上 php->_size = n; php->_capacity = n; //把数组a拷贝进堆中 memcpy(php->_a, a, sizeof(HPDataType) * n); //数组一上来还不是堆,要构建堆 int i = 0; for (i=(n - 1 - 1) / 2;i>=0;i--) AdjustDown(php->_a, php->_size, i); }

五、堆排序

int HeapSort(int* a,int n) { int a[] = { 2,3,4,3,5 }; //1.建堆 //for (int i=n-l;i>= 0;++i) //时间复杂度? //假设树有N个节点,树高度:1ogN //要注意这里时间复杂度不是N * 1ogN,他的时间复杂度是O(N) int i = 0; for (i = (n - 1 - 1) / 2;i >= 0;i--) AdjustDown(a, n, i); int end = n - 1; while (end>0) { //交换堆顶数据和最后一个数据 Swap(&a[0], &a[end]); //再继续选次小的 AdjustDown(a, end, 0); end--; } }

六、堆的销毁

void HeapDestory(Heap* php) { assert(php); free(php->_a); php->_a = NULL; php->_capacity = php->_size = 0; }

七、插入数据

void HeapPush(Heap* php, HPDataType x) { assert(php); if (php->_size == php->_capacity) { php->_capacity *= 2; HPDataType* tmp = (HPDataType*)realloc\ (php->_a,sizeof(HPDataType) * php->_capacity); php->_a = tmp; } php->_a[php->_size++] = x; AdjustUp(php->_a, php->_size, php->_size - 1); }

如图:向上比较调整

http://www.jsqmd.com/news/483678/

相关文章:

  • 苍穹外卖个人技术总结Day03
  • OneAPI镜像免配置部署教程:单文件Docker开箱即用,支持OpenAI/Gemini/Claude等全生态
  • MATLAB矩阵的操作|从线代到实战,一篇就够!
  • CentOS 7.9.2009升级最新的Linux Kernel 6.9.7
  • B站UP主生产力工具:AnythingtoRealCharacters2511快速生成视频开场真人化角色动画
  • Qwen3-ASR-1.7B部署教程:单卡A10/A100部署高精度语音识别系统
  • SecGPT-14B部署教程:解决模型加载失败、Chainlit连接超时问题
  • MiniCPM-o-4.5-nvidia-FlagOS开发者案例:接入企业知识库实现图文混合RAG检索
  • BGE-Large-Zh惊艳效果:中文长句(50字)仍保持高精度语义向量化
  • FireRed-OCR Studio效果展示:学术会议投稿系统PDF→作者信息+摘要+关键词+参考文献自动抽取
  • yz-bijini-cosplay完整指南:Z-Image原生Transformer架构适配解析
  • Qwen3-VL-4B Pro部署教程:GPU优化版图文对话模型一键启动
  • CLIP-GmP-ViT-L-14效果验证:90% ImageNet准确率在真实业务数据表现
  • AI语义搜索与轻量化生成项目部署指南:GTE-Chinese-Large+SeqGPT-560m保姆级教程
  • Qwen3-ForcedAligner-0.6B入门必看:参考文本编写规范与错字容错边界
  • [特殊字符] GLM-4V-9B用户体验:非技术人员使用满意度调研结果
  • Qwen3-VL:30B飞书办公提效:招聘JD截图→岗位要求提取→候选人匹配度评分
  • Qwen3-VL部署避坑指南:交错MRoPE配置错误导致崩溃解决方案
  • ollama部署Phi-4-mini-reasoning入门指南:面向学生与工程师的推理模型实践
  • Qwen3-VL-2B-Instruct环境部署:Docker与非Docker方案对比
  • Cosmos-Reason1-7B镜像部署:CentOS/Ubuntu双系统兼容性验证报告
  • 美胸-年美-造相Z-Turbo开源可持续:CSDN技术博客持续更新+Discord社区支持
  • 文墨共鸣GPU利用率提升:StructBERT双塔推理显存占用降低42%实测
  • FireRedASR-AED-L镜像免配置:Docker Compose一键启停+日志自动轮转
  • Chord服务灰度发布:Qwen2.5-VL模型版本AB测试与效果追踪方案
  • Qwen3-32B漫画脸描述生成多场景落地:短视频MCN机构二次元IP孵化SOP
  • SiameseUIE惊艳效果展示:古籍文本中‘朝代’‘人物’‘官职’跨时代实体识别
  • AI读脸术开发者必看:OpenCV DNN调用避坑实战教程
  • Qwen2.5-72B-Instruct-GPTQ-Int4快速上手:免配置镜像+Web交互全流程
  • Cosmos-Reason1-7B镜像免配置:开箱即用WebUI搭建物理AI开发环境