1.什么是堆

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

2.堆的类型

最大堆:结点的值必须大于等于其孩子结点的值
最小堆:结点的值必须小于等于其孩子结点的值

3.二叉最大堆的实现

堆化元素

堆化是堆最重要的操作,当插入或删除堆的一个元素时,有可能使堆不满足堆的性质,在这种情况下,需要调整堆中元素的位置使之重新变为堆,这个过程叫做堆化。在最大堆中,要堆化一个元素,需要找到它的孩子结点中的最大值,然后将它与当前元素交换,重复该过程直至每个结点都满足堆的性质为止。

Java版本实现

package com.wuyi.notecode.sort;public class Heap {public int[] nums;public int count;//堆中元素个数public int size;//堆的大小public Heap(int size ) {this.size = size;count = 0;nums = new int[size];}//获取父节点public int Parent(int i) {if(i <= 0 || i > this.count)return -1;return( i - 1 ) / 2;}//获取左孩子public int LeftChild(int i) {int l = 2 * i +1;if(l <= 0 || l > this.count - 1)return -1;return l;}//获取右孩子public int RightChild(int i) {int r = 2 * i +2;if(r <= 0 || r > this.count - 1)return -1;return r;}//获取最大值public int GetMax() {if(this.count == 0)return -1;return this.nums[0];}//堆化元素,向下渗透public void PrecolateDown(int k) {//非递归实现while (2 * k < count) {int j = 2 * k + 1;if (j < count - 1 && nums[j] < nums[j + 1])j++;if (j > count - 1 || nums[k] >= nums[j])break;swap(nums, j, k);k = j;}}private void swap(int[] nums, int j, int k) {int temp = this.nums[j];this.nums[j] = this.nums[k];this.nums[k] = temp;}//删除元素,时间复杂度O(logn)public int remove() {if(count == 0)return -1;int temp = nums[0];nums[0] = nums[--count];PrecolateDown(0);return temp;}//插入元素,时间复杂度O(logn)public void insert(int data) {if(count == 0) {nums[0] = data;return;}if(count == size) {ReSizeHeap();}count++;int i = count - 1;while(i > 0 && data > nums[( i - 1) / 2]) {nums[i] = nums[(i - 1) / 2];i = (i - 1) / 2;}nums[i] = data;}private void ReSizeHeap() {int[] newA = new int[size * 2];System.arraycopy(nums, 0, newA, 0, size);size = size * 2;nums = newA;newA = null;}//清空堆public void DestroyHeap() {count = 0;nums = null;}//数组建堆void BuildHeap(int a[] , int n) {if(size == 0)return;while( n > size) {ReSizeHeap();}for(int i = 0 ; i < n ; i++)this.nums[i] = a[i];count = n;for(int i = count / 2 ; i >= 0 ; i--) {PrecolateDown(i);}}//打印堆元素public void display() {for(int i = 0 ; i < count; i++)System.out.print(nums[i] + " ");System.out.println();}public static void main(String[] args) {int[] a = {12,2,3,4,11,6,7,8};Heap heap = new Heap(a.length);heap.BuildHeap(a, a.length);heap.display();heap.insert(15);heap.display();heap.remove();heap.display();heap.DestroyHeap();heap.display();}
}

【数据结构】堆和二叉堆相关推荐

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

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

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

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

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

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

  4. 堆化 二叉堆一般用数组来表示。typedef struct _minHeapNodetypedef struct _otherInfo-icoding-C-数据结构

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

  5. 堆初始化-二叉堆一般用数组来表示。例如,根节点在数组中的位置是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.以此类推.这种存储方式便于寻找 ...

  6. 数据结构之优先队列--二叉堆(Java实现)

    前言 数据结构队列的学习中,我们知道队列是先进先出的.任务被提交到队列中,按照先进先出的原则 对各个任务进行处理.不过在现实的情况下,任务通常有着优先级的概念,例如短任务.管理员的操作 应该优先执行. ...

  7. java实现二叉堆,数据结构基础篇-二叉堆

    二叉堆分为两种,最大堆和最小堆,我们只讨论最小堆的性质,最大堆具有相同的原理. 最小堆是一种符合下面两个特性的树形结构: 最小堆是一颗完全二叉树,即最小堆的每个节点要么没有子节点,要么只有一个左子节点 ...

  8. 数据结构与算法--二叉堆(最大堆,最小堆)实现及原理

    二叉堆(最大堆,最小堆)实现及原理 二叉堆与二叉查找树一样,堆也有两个性质,即结构性质和堆性质.和AVL树一样,对堆的一次操作必须到堆的所有性质都被满足才能终止,也就是我们每次对堆的操作都必须对堆中的 ...

  9. 四叉堆 VS 二叉堆

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

最新文章

  1. cJsonFiles数据结构
  2. select into from 用法_年轻同事不讲武德,直接怼上MySQL常见SQL的七大错误用法
  3. boost::intrusive::derivation_value_traits用法的测试程序
  4. Vboxmanage改动uuid报错的解决的方法
  5. jsp实现网页的在线调查功能
  6. (35)System Verilog引用包中定义的类(成功)
  7. 自动输入命令执行_Ubuntu命令行操作-命令简介
  8. proxychains 一个好用的终端用代理拦截器
  9. shell 分割字符串_谈一谈Shell中的贪婪匹配和非贪婪匹配
  10. 迎接2019多校联合新生训练赛(2018/12/31)
  11. 阶段3 2.Spring_10.Spring中事务控制_1 基于XML的AOP实现事务控制
  12. 切比雪夫多项式(Chebyshev Polynomials)
  13. epoll的两种触发模式ET和LT
  14. photoshop PS 查看像素坐标、像素颜色、像素HSB颜色
  15. 特斯拉Model 3进化不止 传统车企到底应该学什么?
  16. 2015总结与新年计划
  17. 从零开始的Multi-armed Bandit
  18. win10专业版提示“许可证即将过期”怎么办?
  19. 选购云服务器时云盘该如何选择?(高性能/SSD/增强型/急速型)
  20. macOS app动态修改app图标,图标为icns格式

热门文章

  1. 神探夏洛克 | 不再卖腐,第四季的最大的看点变成了……
  2. Sentinel 为 RocketMQ 服务保驾护航
  3. 初探docker部署gitlab
  4. 入坑 c计划 day 1
  5. 特征选择的几种常见方法
  6. 2019-09-03 电感的自感,反电动势方向
  7. 表格 table使用(属性)
  8. react 路由配置以及封装
  9. 如何选择网络任务才能够轻松赚钱?(快营通分享)
  10. java中short类型变量