C语言实现常用数据结构——堆
#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语言实现常用数据结构——堆相关推荐
- c语言将一个已知头结点的单链表逆序_C语言实现常用数据结构:静态链表数组实现(第5篇)...
「今天是学习C语言第 148 天」 纸上学来终觉浅,绝知此事要躬行.-- 陆游「冬夜读书示子聿」 # 静态链表 使用数组实现,利用数组下标代替指针,从而实现数据结点之间的先后关系.实现要点: 1.数组 ...
- aes算法c语言实现_C语言实现常用数据结构:Dijkstra最短路径算法(第18篇)
「今天是学习C语言第 161 天」 纸上学来终觉浅,绝知此事要躬行.-- 陆游「冬夜读书示子聿」#题外话算法学习重点是学习如何编程使用它. # Dijkstra算法 Dijkstra算法,中文译名迪杰 ...
- 中常用的数据结构_C语言实现常用数据结构:基本概念(第0篇
写在前面:为什么学习C语言数据结构 今天开始,我准备和一起分享学习C语言常用数据结构,这里不求事无巨细的掌握数据结构的方方面面,而是学习编程.考试等实际中常用的重要数据结构,这里以分享可以运行的代码为 ...
- c语言必背数据结构_C语言实现常用数据结构:简要一览(第1篇
线性表 最简单的一种数据结构,具有相同类型的数据元素组成的序列.顺序表.链表是其两种简单实现. 备注:数组也可以算一种简单的线性表. 链表可以分为:带头结点的简单链表 不带头结点的简单链表静态链表 循 ...
- c语言堆栈基本代码入栈出栈_C语言实现常用数据结构:栈-顺序栈实现(第6篇)...
栈 栈是一种特殊的线性表,其特性是仅能在表尾进行插入或删除的操作,栈中元素的操作是按照后进先出的原则进行,因此栈又称为后进先出线性表(Last In First Out,LIFO数据结构).栈顶:表尾 ...
- C语言实现常用数据结构——队列
#include<stdio.h> #include<stdlib.h> #define MAX_SIZE 10 /* 用一个动态数组来实现队列 */typedef struc ...
- java set第n位_数据结构与算法——常用数据结构及其Java实现
本文采用Java语言来进行描述,帮大家好好梳理一下数据结构与算法,在工作和面试中用的上.亦即总结常见的的数据结构,以及在Java中相应的实现方法,务求理论与实践一步总结到位. 常用数据结构 数组 数组 ...
- 常用数据结构与经典算法 简单讲解与示例代码
数据结构与算法 数据结构与算法是一个学习计算机绕不过去的话题,而我们大学之中多数课程之中都使用伪代码进行讲解,给对我们的学习理解也是一把双刃剑,虽然可以让我们自己通过算法.思路自己写出程序,但也可能& ...
- 面试常考的常用数据结构与算法
面试常考的常用数据结构与算法 数据结构与算法,这个部分的内容其实是十分的庞大,要想都覆盖到不太容易.在校学习阶段我们可能需要对每种结构,每种算法都学习,但是找工作笔试或者面试的时候,要在很短的时间内考 ...
最新文章
- encodeURIComponent编码2次
- Python编程基础:第五十节 海象运算符Walrus Operator
- 解决 Python2.7 报错 UnicodeDecodeError: 'ascii' codec can't decode...
- 推荐算法炼丹笔记:标签工程
- MYSQL查询空值/NULL值
- HAProxy实现负载均衡及高可用集群(corosync+pacemaker)
- 推荐一个在线创作流程图、思维导图软件—ProcessOn
- 【工作经验分享】不会真有人觉得mybatis很难学吧
- 纽氏达特旗下智能机器人_专业工业机器人增程方案提供商纽氏达
- pdf覆盖图片 Java_Java 添加、替换、删除PDF中的图片的示例代码
- 浅论园子的人对广告的认识
- Linux下配置安装NFS
- 【算法原理+洛谷P6114+HDU6761】Lyndon分解
- 传统数据中心网络架构基本情况
- 12-Qt5调用OpenCV4
- word文档如何插入目录
- nginx uwsgi_pass方式传递真实IP
- 北林嵌入式系统期末复习重点
- “serve with message ‘spawn vue-cli-service ENOENT”的解决办法
- luogu P2698 [USACO12MAR]花盆Flowerpot