最大堆和最小堆的实现

这一讲讲的还是堆,因此将它归入到堆(一)中。这一篇博客的目的非常简单,就是补充一下堆的实现代码。Heap是抽象类,它有两个子类,MaxHeap和MinHeap。回顾一下堆的性质:

最大堆:堆中每一个元素(root除外)都满足,A[parent(i)] >= A[i]. (A为堆, A[i]为相应元素)。

最小堆:堆中每一个元素(root除外)都满足,A[parent(i)] <= A[i]. (A为堆, A[i]为相应元素)。

Heap

Heap,代码如下,它是一个抽象的父类。两个最重要的方法是buildHeap和heapify。

heapify方法:在一个最大堆中,改变元素i的值,为了保持最大堆性质,而调用这个方法。时间复杂度是O(h),h为元素i的高度。

buildHeap方法:从底部元素开始,自底向上构建最大堆。时间复杂度是O(n).​​​​​​​

其中,heapify方法由子类重写。

package heap;public abstract class Heap {int[] items;int heapSize;Heap(int capacity) {items = new int[capacity];}// 根据Max或者Min而变化private void buildHeap() {heapSize = items.length;for (int i = heapSize/2-1; i > -1;i--) {heapify(i);}}// 根据Max或者Min而变化protected abstract void heapify(int i);int left(int i) {return 2*i+1;}int right(int i) {return 2*i+2;}
}

MinHeap

实现了minHeapify方法。

package heap;public class MinHeap extends Heap{public MinHeap(int capacity) {super(capacity);}@Overrideprotected void heapify(int i) {int l = left(i);int r = right(i);int smallest = i;if (l < heapSize && items[l] < items[smallest]) smallest = l;if (r < heapSize && items[r] < items[smallest]) smallest = r;if (smallest != i) {int tmp = items[smallest];items[smallest] = items[i];items[i] = tmp;heapify(smallest);}}
}

MaxHeap

package heap;public class MaxHeap extends Heap {public MaxHeap(int capacity) {super(capacity);}@Overrideprotected void heapify(int i) {int l = left(i);int r = right(i);int largest = i;if (l < heapSize && items[l]>items[largest]) largest = l;if (r < heapSize && items[r]>items[largest]) largest = r;if (largest != i) {int tmp = items[i];items[i] = items[largest];items[largest] = tmp;heapify(largest);}}}

堆(一)最大堆和最小堆的实现相关推荐

  1. C++判断一个序列是否为堆(最大堆、最小堆)

    参考:https://blog.csdn.net/guoweimelon/article/details/50904346 1.如何判断一个序列是不是堆? 把这个序列看成是数组型的二叉树,如果根节点是 ...

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

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

  3. 深入理解堆(最大堆,最小堆及堆排序)

    基本概念: 1.完全二叉树:若二叉树的深度为h,则除第h层外,其他层的结点全部达到最大值,且第h层的所有结点都集中在左子树. 2.满二叉树:满二叉树是一种特殊的的完全二叉树,所有层的结点都是最大值. ...

  4. Java实现堆,最大堆,最小堆,左高树,左低树

    MyList.LinearList参见链接 MyTree.TreeNode参见链接 #Heap package MyHeap;public interface Heap {abstract publi ...

  5. 最大堆和最小堆(数据结构)

    堆和栈的区别: 一.空间分配区别: 栈(操作系统):由操作系统自动分配释放,存放函数的参考值,局部变量的值等.其操作方式类似于数据结构中的栈 堆(操作系统):一般由程序员分配释放,若程序员不释放,程序 ...

  6. 最大堆、最小堆的建立、插入和删除操作

    堆数的定义 堆树的定义如下: (1)堆树是一颗完全二叉树: (2)堆树中某个节点的值总是不大于或不小于其孩子节点的值: (3)堆树中每个节点的子树都是堆树. 当父节点的键值总是大于或等于任何一个子节点 ...

  7. 最大堆,最小堆插入/删除以及最大堆的排序

    先说一下最大堆如何排序:转自:http://www.cnblogs.com/luchen927/archive/2012/03/08/2381446.html 最大堆和最小堆在算法中也有运用.比如用最 ...

  8. 最大堆和最小堆和平衡二叉树_最小堆二叉树

    最大堆和最小堆和平衡二叉树 A Min Heap Binary Tree is a Binary Tree where the root node has the minimum key in the ...

  9. 2020 C++ priority_queue 最大堆与最小堆介绍

    文章目录 1.问题描述 2.具体分析 3.其他方式 4.用最小堆解决问题 1.问题描述 通常在刷题的时候,会遇到最大堆.最小堆的问题,这个时候如果自己去实现一个也是OK的,但是通常时间不太够,那么如何 ...

最新文章

  1. LOADRUNNER 登陆功能测试实例(转)
  2. 慕课网之JavaScript-confirm
  3. MR作业提交时指定第三方依赖jar
  4. CentOS ASP.NET Core Runtime Jexus跨平台布署
  5. 点云数据显示_vispy 显示 kitti 点云数据
  6. PHP无法执行MySQL语句,解决PHP执行批量MySQL语句的问题
  7. python 制定识别图片的某些区域_python批量识别图片指定区域文字内容
  8. c++课程学习(未完待续)
  9. Broadwell I7-5775c/5675c BSOD 蓝屏问题
  10. 【iVX从入门到精通 · 开篇】初始iVX——零代码的可视化编程语言
  11. web前端大作业:游戏动漫网页设计(HTML+CSS+JavaScript)
  12. 2021五一数学建模B题思路
  13. python pyhook_python使用pyHook.HookManager()返回来的event中,event.Time肿么转换成为datetime形式?...
  14. Lorenz系统的吸引子相图
  15. GNU autotools 下载和安装
  16. 计算机一级打字要注意什么,用键盘打字时要注意什么 怎样用键盘来练习打字...
  17. java locale string_java.lang.String.toUpperCase(Locale locale)方法实例
  18. JQuery移动动画实现点击按钮切换图片--JQuery基础
  19. 银行钱数(带小数位)转大写
  20. iPhone13外部拨打电话总是暂时无法接通解决方案

热门文章

  1. ARIMA/Sarima与LSTM的时间序列数据集成学习(附链接)
  2. 单点登录系统【All登录系统优化】
  3. 德玛西亚之WorkFlow(五)流程引擎创建
  4. 微信公众号实现无限制推送模板消息之免开发的玩法!
  5. 关于JAVA Bean实体类对象pojo,vo,po,dto,entity之间的区别
  6. xp系统打印机服务器报错,XP系统使用打印机弹出Spoolsv.exe 应用程序错误怎么办...
  7. CV和Resume到底是什么,有什么差别?
  8. oracle子库存转移项目转移,是什么原因呢?物料可以做子库存转移?
  9. ubuntu 14.04 截屏快捷键
  10. 牛市来了?这几款开源项目让你的交易更加得心应手