堆化
二叉堆一般用数组来表示。例如,根节点在数组中的位置是0,第n个位置的子节点分别在2n+1和 2n+2。 
因此,第0个位置的子节点在1和2,1的子节点在3和4。以此类推。这种存储方式便于寻找父节点和子节点。
在二叉堆上可以进行插入节点、删除节点、取出值最小的节点、减小节点的值等基本操作。

“最小堆”的定义如下:

typedef struct _otherInfo
{int i;int j;
}OtherInfo;typedef struct _minHeapNode
{int value;OtherInfo otherInfo;
}MinHeapNode, *PMinHeapNode;typedef struct _minPQ {PMinHeapNode heap_array; // 指向堆元素数组int heap_size; // 当前堆中的元素个数int capacity;  //堆数组的大小
}MinHeap, *PMinHeap;

void min_heapify(PMinHeap pq, int i);
其中 pq指向堆,i 为堆元素在数组中的下标。该函数假设元素i对应的子树都已经是最小堆
(符合最小堆的要求),但元素i为根的子树并不是最小堆,
min_heapify将对元素i及其子树的各结点进行调整,使其为一个最小堆。

//堆辅助函数
int parent(int i){return (i - 1) / 2;
}int left(int i){return 2* i + 1;
}int right(int i){return 2 * i + 2;
}void swap_node(MinHeapNode *x, MinHeapNode *y){int value;int i, j;value = y->value;i = y->otherInfo.i;j = y->otherInfo.j;y->value = x->value;y->otherInfo.i = x->otherInfo.i;y->otherInfo.j = x->otherInfo.j;x->value = value;x->otherInfo.i = i;x->otherInfo.j = j;return;
}

示例代码如下:

#include <stdio.h>
#include <stdlib.h>
#include "minbinheap.h"void min_heapify(PMinHeap pq, int i){int j = parent(i);//if(pq->heap_array[i].value > pq->heap_array[j].value) return;for(; j >= 0 && pq->heap_array[i].value > pq->heap_array[j].value; i = j, j = parent(i))swap_node(&pq->heap_array[i], &(pq->heap_array[j]));
}

其实...

一行就够了

void min_heapify(PMinHeap pq, int i){for(int j = parent(i); j >= 0 && pq->heap_array[i].value > pq->heap_array[j].value; i = j, j = parent(i))swap_node(&pq->heap_array[i], &(pq->heap_array[j]));}

堆化 二叉堆一般用数组来表示。typedef struct _minHeapNodetypedef struct _otherInfo-icoding-C-数据结构相关推荐

  1. 堆初始化-二叉堆一般用数组来表示。例如,根节点在数组中的位置是0,第n个位置的子节点分别在2n+1和 2n+2-icoding-void init_min_heap(PMinHeap pq, int

    堆初始化 二叉堆一般用数组来表示.例如,根节点在数组中的位置是0,第n个位置的子节点分别在2n+1和 2n+2.  因此,第0个位置的子节点在1和2,1的子节点在3和4.以此类推.这种存储方式便于寻找 ...

  2. java 二叉堆_二叉堆(三)之 Java的实现

    概要 前面分别通过C和C++实现了二叉堆,本章给出二叉堆的Java版本.还是那句话,它们的原理一样,择其一了解即可. 二叉堆的介绍 二叉堆是完全二元树或者是近似完全二元树,按照数据的排列方式可以分为两 ...

  3. 二叉堆与二叉堆的构建

    什么是二叉堆? 二叉堆本质上是一种完全二叉树,它分为两个类型: 最大堆:任何一个父节点的值,都大于或等于它左.右孩子节点的值. 最小堆:任何一个父节点的值,都小于或等于它左.右孩子节点的值. 二叉堆的 ...

  4. java 二叉堆_二叉堆的介绍和Java实现

    一.堆和二叉堆 堆,英文名称Heap,所谓二叉堆(也有直接称二叉堆为堆的),本质上是一个完全二叉树,前面也提到过,如果树接近于完全二叉树或者满二叉树,采用顺序存储代价会小一点,因此常见的二叉堆均是顺序 ...

  5. 【数据结构】堆和二叉堆

    1.什么是堆 堆是一棵具有特定性质的二叉树,堆的基本要求是堆中所有结点的值必须大于等于(或小于等于)其孩子结点的值,这也称为堆的性质.堆还有另一个性质,就是当h>0时,所有叶子结点都处于第h或h ...

  6. 四叉堆 VS 二叉堆

    转至: http://hi.baidu.com/iceboy_/home 转载于:https://www.cnblogs.com/Lipp/archive/2012/04/06/2435257.htm ...

  7. 信息竞赛进阶指南--二叉堆(模板)

    啥是二叉堆 二叉堆是一种特殊的堆,二叉堆是完全二元树(二叉树)或者是近似完全二元树(二叉树).二叉堆有两种:最大堆和最小堆.最大堆:父结点的键值总是大于或等于任何一个子节点的键值:最小堆:父结点的键值 ...

  8. 图解:什么是二叉堆?

    在正式开始学习堆之前,一定要大脑里回顾一下什么是完全二叉树,因为它和堆可是息息相关奥! 如果二叉树中除了叶子结点,每个结点的度都为 2,则此二叉树称为满二叉树. 而如果二叉树中除去最后一层节点为满二叉 ...

  9. 二叉堆(TopK问题,优先级队列)

    目录 实现一个大根堆 优先级队列 Comparable和Compator区别 compareTo方法 TopK问题 TopK问题常见题型为求最大(最小)的K个值. 我们一般拿堆来解决. 堆:二叉堆首先 ...

最新文章

  1. mahout kmeans
  2. Docker学习(3)——安装部署过程及简单应用
  3. 西南科技大学城市学院计算机专科,西南科技大学城市学院官网
  4. 如何利用bat在同一个IE用多个选项卡的方式打开多个网址? 如何利用bat在同一个IE用多个选项卡的方式打开多个网址? 我的网址是这样的http://www.xags.gov.cn:8003/gga
  5. 黄聪:详解 ManualResetEvent(转)
  6. 注入器 过检测_福特全顺V348检测车报价
  7. mybatis 3的TypeHandler深入解析(及null值的处理)
  8. Python中近期Pandas使用总结
  9. ldpcMATLAB/ldpc的译码,matlab程序/LDPC编码的matlab实现/源码
  10. 大学往事 第五章 计算机班的女生
  11. android 解压jar,解压和打包Jar - 海阔天空玩世不恭的个人空间 - OSCHINA - 中文开源技术交流社区...
  12. 基于Python、scrapy爬取软考在线题库
  13. SpringBoot整合Mybaits开发报java.lang.IllegalArgumentException: At least one base package must be specifie
  14. android仿朋友圈教程,android 仿朋友圈动态 图片查看效果
  15. PATCHY-SAN - Learning Convolutional Neural Networks for Graphs ICML
  16. Postman接口测试工具
  17. 【GoLang】Map的遍历
  18. 【PAT乙级】1103 缘分数 (20 分)
  19. General error: 8 attempt to write a readonly database
  20. 区分阿里云系统盘和数据盘

热门文章

  1. 怎么查看ubuntu是多少位和常用信息
  2. clob字段怎么导出_Oracle 11g及12c+版本下为啥有些表不能exp导出?
  3. 计算机与交通工程论文,交通工程论文.doc
  4. JavaWeb应用开发实验报告下载(共12个)
  5. 人工智能时代,学好数学有什么用?
  6. 利用11行Python代码,盗取了室友的U盘,内容十分刺激!
  7. Python资料分享来袭,收下不谢!
  8. 11没有源码注释_我们为什么要看源码、应该如何看源码?
  9. Android获取Linux图像信息,Android系统信息获取 之十三:Linux内核版本信息获取
  10. 无源的nfc加传感_基于ON Semiconductor SPS无源温度标签,应用于冷链运输的 UHF 标签读取器方案...