优先级队列和堆

堆的存储方式

使用数组来保存二叉树,将二叉树的层序遍历结果按顺序放入数组中。这种方式只适合保存完全二叉树,因为非完全二叉树会浪费空间。

最大堆

满足任意节点的值都大于其子树中节点的值,叫做最大堆。

向下调整建最大堆:

    public static void adjustDown(int[] array,int parent,int len) {int child = parent * 2 + 1;  //左孩子while(child < len) {//判断是否有右孩子,并找出左右孩子的最大值的下标if (child + 1 < len && array[child] < array[child + 1] ) {child ++;}//child中存储的就是最大值的下标if (array[child] > array[parent]) {  //大堆,左右节点最大值和父节点交换int temp = array[child];array[child] = array[parent];array[parent] = temp;//交换完成后,向下调整parent = child;child = parent * 2 + 1;}else {break;}}}public static void createHeap(int[] array) {int len = array.length;//向下调整建堆,每次从最后一个节点的父节点开始//len - 1 是最后一个节点的下标   (len - 1 - 1 ) / 2   就等价于  parent = (child - 1) / 2for (int i = (len - 1 - 1) / 2; i  >= 0; i--) {adjustDown(array,i,len);}System.out.println(Arrays.toString(array));}

最小堆

满足任意节点的值都小于其子树中节点的值,叫做最小堆。

类似于最大堆,使用向下调整建最小堆,只是子结点中取最小,小于父节点则交换

  public static void adjustDown(int[] array,int parent,int len) {int child = parent * 2 + 1; while(child < len) {if (child + 1 < len && array[child + 1] < array[child ] ) {  //左右节点取最小child ++;}if (array[child] < array[parent]) {   //小于父节点才交换int temp = array[child];array[child] = array[parent];array[parent] = temp;parent = child;child = parent * 2 + 1;}else {break;}}}

堆排序

升序建最大堆,降序建最小堆

以升序为例:

  public static void heapSort(int[] array) {if (array.length == 0) return;createHeap(array); //求升序,建最大堆int len = array.length - 1;while(len > 0) {int temp = array[0];array[0] = array[len];array[len] = temp;//交换之后向下调整adjustDown(array,0,len);len--;}System.out.println(Arrays.toString(array));}

优先级队列

Java数据结构中的优先级队列就是堆的应用

 int[] array = new int[]{25,7,12,3,83,31};PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();  //优先级队列for (Integer i :array) {priorityQueue.offer(i);}System.out.println(priorityQueue);
//[3, 7, 12, 25, 83, 31]  java中的优先级队列默认是最小堆

创建最大堆、最小堆、图解堆排序相关推荐

  1. java 最小堆_堆排序 最大堆 最小堆 Java 实现

    堆 一点疑惑,堆排序是就地排序,所以空间复杂度是 O(1).但是,比如我有一个数组,建立一个最小堆,然后每次取出最小堆的顶点.建立最小堆需要额外空间? 不深究了,归并排序需要额外空间. 堆是完全二叉树 ...

  2. C++实现最大堆最小堆

    目录 堆和栈的区别 最大堆与最小堆 最大堆的操作 最大堆的插入操作 最大堆的弹出操作 最大堆的C++代码实现 最小堆概念 最小堆的插入操作 最小堆的弹出操作 最小堆的C++代码实现 最大堆最小堆的应用 ...

  3. Golang实现最大堆/最小堆

    Golang实现最大堆/最小堆 参考: https://yangjiahao106.github.io/2019/01/15/golang-%E6%9C%80%E5%A4%A7%E5%A0%86%E5 ...

  4. python实现最大堆,最小堆和堆排序

    目录 0.什么是堆 1.最大堆的实现 2.最小堆的实现 3.堆排序 0.什么是堆 小堆和大堆分为如下图: 堆需要满足的条件: 1. 必须是二叉树,且必须是完全二叉树 2. 各个父节点必须大于或小于左右 ...

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

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

  6. 最大堆最小堆的实现(C语言)

    ---------------- 该篇文章经提醒有一些错误,暂时没有时间修改,请勿参考. 该篇文章经提醒有一些错误,暂时没有时间修改,请勿参考. ---------------- 堆是特殊的队列,从堆 ...

  7. C++STL中的最大堆,最小堆

    堆,优先队列,头文件和队列是同一个#include<queue> #include<iostream> #include<queue> using namespac ...

  8. C++ 最大堆最小堆与push_heap pop_heap

    make_heap:根据不同参数生成大顶堆或者小顶堆,默认大顶堆. make_heap(_RAIter,_RAIter) 默认生成大顶堆 make_heap(_RAIter,_RAIter,_Comp ...

  9. python 中的最大堆和最小堆(heapq库)

    目录 首先来看一下什么是最大堆和最小堆? python heapq库中的一些常用方法 小试牛刀 首先来看一下什么是最大堆和最小堆? 最大堆:一种经过排序的完全二叉树,其中任意非终端节点数值均不小于其左 ...

  10. WebServer代码解读(3)【最小堆定时器与队列】

    文章目录 1 - 处理事件 1-1 接收新连接 1-2 最小堆定时器 1-4 将request加入线程池 1-5 处理request 1 - 处理事件 因为epoll_wait函数已经返回了需要处理的 ...

最新文章

  1. 新手必看:Python 3.8六大新功能
  2. (0094)iOS开发之本地文件预览的三种方法(2)
  3. SDN学习之旅-RYU笔记(1)
  4. navicat的安装
  5. Sqlite error- INSERT failed: datatype mismatch
  6. Vim/GVim格式化xml文件
  7. 人月神话阅读笔记之二
  8. CentOS 开机自启动配置方法
  9. sqlmap指定cookie_sqlmap处理cookie数据
  10. python支付宝自动支付_python-支付宝支付示例
  11. grep配置颜色显示
  12. 如何编写开源项目的 README 文档
  13. poj2054 Color a Tree
  14. USACO3.4.3 Raucous Rockers (rockers)
  15. 论文笔记(显微图像拼接)——A fast algorithm for material image sequential stitching
  16. ajax接收反参时,接收到[object XMLDocument]时的处理方法
  17. iOS开发--APP性能检测方案汇总(一)
  18. Kubernetes(5)job控制器
  19. 孩子该不该学编程?学编程有用吗?
  20. 建模常用的概念介绍1: WOE、IV

热门文章

  1. AJP:22q11.2缺失综合征青少年gamma频带反应和远程通信中断的异常发育模式
  2. windows窗口分析,父窗口,子窗口,所有者窗口
  3. 软件包管理工具snap的安装及常用命令
  4. ETL工程师 2021-11-14
  5. jdbc连接mysql的serverTimeZone参数配置
  6. 论文笔记:残差神经网络(ResNet v1)
  7. Web 利用纯html和css画出一个android机器人
  8. Tablestore结合Spark的流批一体SQL实战
  9. 将ADS(Advanced Design system)中的版图导入到AD(Altium Designer)中编辑
  10. LM334芯片到底是恒流源还是温度传感器?