#include<stdio.h>
#include<stdlib.h>
#define CAPACITY 20/*堆有两个性质:* 1.结构性:堆必须是一颗完全二叉树* 2.堆序性:堆的父节点要么都大于子节点,要么小于子节点,前者叫大顶堆,后者叫小顶堆;* 由此,堆可以用一个数组来表示,并有如下性质:* 1.对于任意i位置的元素,他的左子节点在2i位置,右子节点在2i+1位置;* 2.他的父节点(假如有)在i/2位置*//*创建一个小顶堆,size代表的是实际元素的个数*/
typedef struct MinHeap {int size;int data[CAPACITY];
} heap;void init( heap *h );
void insert(heap *h,int x);
void travel(heap *h);/*数组0位置要空着*/
void init( heap *h ) {h->size=0;
}void insert(heap *h,int x) {if(h->size == CAPACITY) {printf("heap is full!");return;}int i;h->size++;for(i=h->size; i>=1; i/=2) {if(x < h->data[i/2]) {h->data[i]=h->data[i/2];} else {break;}}h->data[i]=x;
}
/*删除最小元素,在小顶堆即意味着删除根节点* 1.首先将根元素保存,等待最后return;* 2.将最后一个元素赋值给根元素,并将这个值赋给缓冲区,这样保证了堆的结构性;* 3.从根节点开始遍历,比较父节点和两个子节点的大小,如果缓冲区值大于较小的子节点,则将小节点的值赋给父节点* 4.直到缓冲区值小于游标的两个子节点,此时将缓冲区值赋给游标所在位置*/
int deleteMin(heap *h) {int child;int result=h->data[1];h->data[1]=h->data[h->size];h->size--;int i=1;int temp=h->data[1];for(i=1; 2*i <= h->size; i=child) {child=2*i;if(child !=h->size && h->data[child] > h->data[child+1] ) {/*如果左子节点非最后元素且>右子节点,则右子节点最小*/child++;}if(temp > h->data[child]) {/*如果temp大于当前元素的最小子节点,则将最小子节点赋值给父节点,否则跳出*/h->data[i]=h->data[child];} else {break;}}h->data[i]=temp;/*将缓冲区值赋给当前游标*/return result;
}/*遍历堆数组:越过空白位置0,从1开始*/
void travel(heap *h) {int i;for(i=1; i<=h->size; i++) {printf("%d ",h->data[i]);}printf("\n");
}/*堆排序*/
void heap_sort(int a[],int n) {int i;heap *h=(heap*)malloc(sizeof(heap));/*给堆指针分配空间*/init(h);/*初始化堆*/for(i=0; i<n; i++) {/*将数组的元素依次插入堆*/insert(h,a[i]);}for(i=0; i<n; i++) {a[i]=deleteMin(h);}
}
/*遍历数组*/
void travel_array(int a[],int n) {int i;for(i=0; i<n; i++) {printf("%d ",a[i]);}printf("\n");
}main() {int a[]= {67,8,4,34,86,87,6,45,7,864,56,1,3,78,9,13};int n=sizeof(a)/sizeof(int);travel_array(a,n);heap_sort(a,n);travel_array(a,n);
}

转载于:https://www.cnblogs.com/wangbin2188/p/9603437.html

C语言实现常用数据结构——堆相关推荐

  1. c语言将一个已知头结点的单链表逆序_C语言实现常用数据结构:静态链表数组实现(第5篇)...

    「今天是学习C语言第 148 天」 纸上学来终觉浅,绝知此事要躬行.-- 陆游「冬夜读书示子聿」 # 静态链表 使用数组实现,利用数组下标代替指针,从而实现数据结点之间的先后关系.实现要点: 1.数组 ...

  2. aes算法c语言实现_C语言实现常用数据结构:Dijkstra最短路径算法(第18篇)

    「今天是学习C语言第 161 天」 纸上学来终觉浅,绝知此事要躬行.-- 陆游「冬夜读书示子聿」#题外话算法学习重点是学习如何编程使用它. # Dijkstra算法 Dijkstra算法,中文译名迪杰 ...

  3. 中常用的数据结构_C语言实现常用数据结构:基本概念(第0篇

    写在前面:为什么学习C语言数据结构 今天开始,我准备和一起分享学习C语言常用数据结构,这里不求事无巨细的掌握数据结构的方方面面,而是学习编程.考试等实际中常用的重要数据结构,这里以分享可以运行的代码为 ...

  4. c语言必背数据结构_C语言实现常用数据结构:简要一览(第1篇

    线性表 最简单的一种数据结构,具有相同类型的数据元素组成的序列.顺序表.链表是其两种简单实现. 备注:数组也可以算一种简单的线性表. 链表可以分为:带头结点的简单链表 不带头结点的简单链表静态链表 循 ...

  5. c语言堆栈基本代码入栈出栈_C语言实现常用数据结构:栈-顺序栈实现(第6篇)...

    栈 栈是一种特殊的线性表,其特性是仅能在表尾进行插入或删除的操作,栈中元素的操作是按照后进先出的原则进行,因此栈又称为后进先出线性表(Last In First Out,LIFO数据结构).栈顶:表尾 ...

  6. C语言实现常用数据结构——队列

    #include<stdio.h> #include<stdlib.h> #define MAX_SIZE 10 /* 用一个动态数组来实现队列 */typedef struc ...

  7. java set第n位_数据结构与算法——常用数据结构及其Java实现

    本文采用Java语言来进行描述,帮大家好好梳理一下数据结构与算法,在工作和面试中用的上.亦即总结常见的的数据结构,以及在Java中相应的实现方法,务求理论与实践一步总结到位. 常用数据结构 数组 数组 ...

  8. 常用数据结构与经典算法 简单讲解与示例代码

    数据结构与算法 数据结构与算法是一个学习计算机绕不过去的话题,而我们大学之中多数课程之中都使用伪代码进行讲解,给对我们的学习理解也是一把双刃剑,虽然可以让我们自己通过算法.思路自己写出程序,但也可能& ...

  9. 面试常考的常用数据结构与算法

    面试常考的常用数据结构与算法 数据结构与算法,这个部分的内容其实是十分的庞大,要想都覆盖到不太容易.在校学习阶段我们可能需要对每种结构,每种算法都学习,但是找工作笔试或者面试的时候,要在很短的时间内考 ...

最新文章

  1. encodeURIComponent编码2次
  2. Python编程基础:第五十节 海象运算符Walrus Operator
  3. 解决 Python2.7 报错 UnicodeDecodeError: 'ascii' codec can't decode...
  4. 推荐算法炼丹笔记:标签工程
  5. MYSQL查询空值/NULL值
  6. HAProxy实现负载均衡及高可用集群(corosync+pacemaker)
  7. 推荐一个在线创作流程图、思维导图软件—ProcessOn
  8. 【工作经验分享】不会真有人觉得mybatis很难学吧
  9. 纽氏达特旗下智能机器人_专业工业机器人增程方案提供商纽氏达
  10. pdf覆盖图片 Java_Java 添加、替换、删除PDF中的图片的示例代码
  11. 浅论园子的人对广告的认识
  12. Linux下配置安装NFS
  13. 【算法原理+洛谷P6114+HDU6761】Lyndon分解
  14. 传统数据中心网络架构基本情况
  15. 12-Qt5调用OpenCV4
  16. word文档如何插入目录
  17. nginx uwsgi_pass方式传递真实IP
  18. 北林嵌入式系统期末复习重点
  19. “serve with message ‘spawn vue-cli-service ENOENT”的解决办法
  20. luogu P2698 [USACO12MAR]花盆Flowerpot

热门文章

  1. windows server 2012多用户用一个账号同时登陆
  2. 知乎高赞:985计算机视觉毕业后找不到工作怎么办?怒刷leetcode,还是另寻他路?
  3. 聊聊单体应用的 4 点不良影响,第 4 点很痛很真实
  4. 996和被辞退,二选一
  5. 当 HTTP 连接池遇上 KeepAlive 时
  6. Go语言学习之encoding/json包
  7. Spring实战1:Spring初探
  8. IDEA中实用的快捷方式
  9. 42.移动构造函数的合成规则
  10. Spring Boot切换其他嵌入式的Servlet容器