#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=;
} void insert(heap *h,int x) {
if(h->size == CAPACITY) {
printf("heap is full!");
return;
}
int i;
h->size++;
for(i=h->size; i>=; i/=) {
if(x < h->data[i/]) {
h->data[i]=h->data[i/];
} else {
break;
}
}
h->data[i]=x;
}
/*删除最小元素,在小顶堆即意味着删除根节点
* 1.首先将根元素保存,等待最后return;
* 2.将最后一个元素赋值给根元素,并将这个值赋给缓冲区,这样保证了堆的结构性;
* 3.从根节点开始遍历,比较父节点和两个子节点的大小,如果缓冲区值大于较小的子节点,则将小节点的值赋给父节点
* 4.直到缓冲区值小于游标的两个子节点,此时将缓冲区值赋给游标所在位置*/
int deleteMin(heap *h) {
int child;
int result=h->data[];
h->data[]=h->data[h->size];
h->size--;
int i=;
int temp=h->data[];
for(i=; *i <= h->size; i=child) {
child=*i;
if(child !=h->size && h->data[child] > h->data[child+] ) {/*如果左子节点非最后元素且>右子节点,则右子节点最小*/
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=; 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=; i<n; i++) {/*将数组的元素依次插入堆*/
insert(h,a[i]);
}
for(i=; i<n; i++) {
a[i]=deleteMin(h);
}
}
/*遍历数组*/
void travel_array(int a[],int n) {
int i;
for(i=; i<n; i++) {
printf("%d ",a[i]);
}
printf("\n");
} main() {
int a[]= {,,,,,,,,,,,,,,,};
int n=sizeof(a)/sizeof(int);
travel_array(a,n);
heap_sort(a,n);
travel_array(a,n);
}

C语言实现常用数据结构——堆的更多相关文章

  1. C语言实现常用数据结构——链表

    #include<stdio.h> #include<stdlib.h> typedef struct Node { int data; struct Node *next; ...

  2. C语言实现常用数据结构——图

    #include<stdio.h> #include<stdlib.h> #define SIZE 20 #define LENGTH(a) (sizeof(a)/sizeof ...

  3. C语言实现常用数据结构——二叉树

    #include<stdio.h> #include<stdlib.h> #define SIZE 10 typedef struct Tree { int data; str ...

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

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

  5. C语言实现常用数据结构——栈

    #include<stdio.h> #include<stdlib.h> //用链表实现栈 typedef struct Node { int data; struct Nod ...

  6. C++常用数据结构的实现

    常用数据结构与算法的实现.整理与总结 我将我所有数据结构的实现放在了github中:Data-Structures-Implemented-By-Me 常用数据结构与算法的实现.整理与总结 KMP字符 ...

  7. 1. C语言中的数据结构.md

    C语言内建数据结构类型 整型 整型数据是最基本的数据类型,不过从整形出发衍生出好几种integer-like数据结构,譬如字符型,短整型,整型,长整型.他们都是最基本的方式来组织的数据结构,一般是几位 ...

  8. 常用数据结构及复杂度 array、LinkedList、List、Stack、Queue、Dictionary、SortedDictionary、HashSet、SortedSet

    原文地址:http://www.cnblogs.com/gaochundong/p/data_structures_and_asymptotic_analysis.html  常用数据结构的时间复杂度 ...

  9. php常用数据结构

    # 常用数据结构--------------------------------------------------------------------------------## 树(Tree)- ...

随机推荐

  1. 关于CORS跨域更细节的思考

    权威的资料看MDN,也可以看阮一峰的文章.不过感觉阮一峰对于CORS的描述有问题,简单请求被阮一峰描述为2次浏览器请求了.这个要自己搭个服务器试一下.跨域基本都是根据域名判断的,自己是否要再买个域名呢 ...

  2. 为 Mac Finder 增加右键文件打包压缩(免费)

    在 Windows 上用惯了 7-Zip 和 WinRAR,来到 Mac 却突然发现没有类似的工具?Mac 自带的 Zip 工具确实让人吐糟无力,压缩率低就不说了,因为 Mac 上文件名是 Unico ...

  3. R 语言基本操作(基本信息的查看、与本地文件系统交互、编译器版本升级)

    0. 信息及路径的查看 getwd() ⇒ 查看路径: setwd() ⇒ 设置路径: .libPaths() ⇒ R 语言库所在的位置: sessionInfo() ⇒ 查询版本及系统和库等信息: ...

  4. 3-2 从降级的例子 认识Polly套路

    1 没有返回值的降级 Policy policy = Policy.Handle<Exception>().Fallback(() => { Console.WriteLine(&q ...

  5. crossplatform----文本编辑器工具Atom安装

    1.简介 Atom 是 Github 专门为程序员推出的一个跨平台文本编辑器.具有简洁和直观的图形用户界面,并有很多有趣的特点:支持CSS,HTML,JavaScript等网页编程语言.它支持宏,自动 ...

  6. 【Quartz】定时器初步实验(一)

    原文:[Quartz]定时器初步实验(一)     以前就了解了Quartz这个定时框架,但是一直没有认真的去关注他,最近忽然看到已经更新到3.0.4支持异步操作了所以就写个简单的小例子看看好用不. ...

  7. Servlet 3.1实践

    Servlet 3.1 新特性详解 参考: IBM developerworks: Servlet 3.0 新特性详解 开涛的博客: Servlet3.1规范(最终版) 关键特性 Asynchroni ...

  8. WPF特效-鱼游动动画2

    原文:WPF特效-鱼游动动画2           纯代码撸动画实践2:           原图:(png格式)                                            ...

  9. surfaceview组件的surfaceCreated()不被调用的解决方案

    原文:surfaceview组件的surfaceCreated()不被调用的解决方案 有时候我们有需要在native层做在surfaceview的上下文中做渲染,这个时候只是提供了一个单独什么都不做的 ...

  10. window 10 64bit Tortoise SVN 图标状态显示不正常

    https://www.cnblogs.com/lzpong/p/6187366.html 根据以上帖子处理 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows ...