完全二叉树叫做堆。

完全二叉树就是最后一个节点之前不允许有不满的节点,就是不允许有空洞。

可以使用数组来做完全二叉树(堆)。

堆分为大顶堆和小顶堆。大顶堆就是根节点上的数字是最大的,小顶堆就是根节点上的数字是最小的堆。

在堆里面的操作包括两种:插入新的节点和删除根节点。

插入新节点的操作时向上渗透。删除根节点的操作是向下渗透。

插入新节点时,把新的节点插入到最后一个位置,然后慢慢向上渗透(和父辈交换)。删除根节点时,把最后一个节点放到根节点上,然后再慢慢向下渗透(和子代交换)。

下面使用Java写一个大顶堆。

  1. package Heap;
  2.  
  3. public class MaxHeap {
  4. private int[] heapArray;
  5. private int maxSize;
  6. private int currentSize;
  7. /*构造函数*/
  8. public MaxHeap(int mx) throws Exception {
  9. if(mx < 1) throw new Exception("max size must be >=1");
  10. maxSize = mx;
  11. currentSize = 0;
  12. heapArray = new int[maxSize];
  13. }
  14. /*向上渗透,index为下标*/
  15. private void trickleUp(int index){
  16. int parent = (index - 1) / 2;
  17. int bottom = heapArray[index];
  18. while(index>0 && heapArray[parent]<bottom){
  19. heapArray[index] = heapArray[parent];
  20. index = parent;
  21. parent = (parent - 1) / 2;
  22. }
  23. heapArray[index] = bottom;
  24. }
  25. /*向下渗透*/
  26. private void trickleDown(int index){
  27. int largerChild;
  28. int top = heapArray[index];
  29. while(index < currentSize / 2){
  30. int leftChild = 2 * index + 1;
  31. int rightChild = 2 * index + 2;
  32. if(rightChild<currentSize && heapArray[leftChild]<heapArray[rightChild])
  33. largerChild = rightChild;
  34. else
  35. largerChild = leftChild;
  36. if(top >= heapArray[largerChild])
  37. break;
  38. heapArray[index] = heapArray[largerChild];
  39. index = largerChild;
  40. }
  41. heapArray[index] = top;
  42. }
  43. public boolean IsEmpty(){
  44. return currentSize == 0;
  45. }
  46. public void Push(int num) throws Exception{
  47. if(currentSize == maxSize) throw new Exception("MaxHeap id full");
  48. heapArray[currentSize] = num;
  49. trickleUp(currentSize);
  50. currentSize++;
  51. }
  52. public int Top(){
  53. return heapArray[0];
  54. }
  55. public void Pop(){
  56. heapArray[0]=heapArray[--currentSize];
  57. trickleDown(0);
  58. }
  59. public static void main(String[] args) throws Exception {
  60. System.out.println("测试大顶堆");
  61. MaxHeap maxHeap = new MaxHeap(100);
  62. System.out.println(maxHeap.IsEmpty());
  63. maxHeap.Push(20);
  64. maxHeap.Push(30);
  65. maxHeap.Push(40);
  66. System.out.println(maxHeap.Top());
  67. maxHeap.Push(90);
  68. maxHeap.Push(80);
  69. maxHeap.Push(70);
  70. System.out.println(maxHeap.Top());
  71. maxHeap.Pop();
  72. System.out.println(maxHeap.Top());
  73. maxHeap.Pop();
  74. System.out.println(maxHeap.Top());
  75. maxHeap.Pop();
  76. System.out.println(maxHeap.Top());
  77. }
  78. }

堆排序就是迭代弹出栈顶元素。

堆排序的时间复杂度是O(nlogn).

数据结构与算法(Java版)_堆的更多相关文章

  1. 数据结构与算法Java描述 队列

    package com.cjm.queue; /** * 数据结构与算法Java实现 队列 * * @author 小明 * */ public class Myqueue { private Nod ...

  2. 北京大学公开课《数据结构与算法Python版》

    之前我分享过一个数据结构与算法的课程,很多小伙伴私信我问有没有Python版. 看了一些公开课后,今天特向大家推荐北京大学的这门课程:<数据结构与算法Python版>. 课程概述 很多同学 ...

  3. 数据结构与算法 java描述 第一章 算法及其复杂度

    目录 数据结构与算法 java描述 笔记 第一章 算法及其复杂度 算法的定义 算法性能的分析与评价 问题规模.运行时间及时间复杂度 渐进复杂度 大 O 记号 大Ω记号 Θ记号 空间复杂度 算法复杂度及 ...

  4. 【数据结构与算法Python版学习笔记】引言

    学习来源 北京大学-数据结构与算法Python版 目标 了解计算机科学.程序设计和问题解决的基本概念 计算机科学是对问题本身.问题的解决.以及问题求解过程中得出的解决方案的研究.面对一 个特定问题,计 ...

  5. 排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题

    常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结 ...

  6. 【数据结构与算法Python版学习笔记】树——利用二叉堆实现优先级队列

    概念 队列有一个重要的变体,叫作优先级队列. 和队列一样,优先级队列从头部移除元素,不过元素的逻辑顺序是由优先级决定的. 优先级最高的元素在最前,优先级最低的元素在最后. 实现优先级队列的经典方法是使 ...

  7. 数据结构Java版之堆&堆排序(九)

    堆分为大顶堆,和小顶堆. 什么是堆? 堆可以看成是一棵二叉树,二叉树的元素是一个数组不断的从左到右轮训放置.如果是大顶堆,则大的数放上面一层,小的数放下面一层.上一层的数,一定大于下一层的数.小顶堆则 ...

  8. 常用排序算法--java版

    package com.whw.sortPractice; import java.util.Arrays; public class Sort { /** * 遍历一个数组 * @param sor ...

  9. 排序算法系列:插入排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)

    在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 我总结一个清晰不罗嗦版: 原理: 和选择排序类似的是也分成“已排序”部分,和“未排 ...

  10. 排序算法系列:选择排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)

    在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 我总结一个清晰不罗嗦版: 原理: 从数组头元素索引i开始,寻找后面最小的值(比i位 ...

随机推荐

  1. CodeForces - 138C: Mushroom Gnomes - 2 (线段树&概率&排序)

    One day Natalia was walking in the woods when she met a little mushroom gnome. The gnome told her th ...

  2. Codeforces 802 ABC. Heidi and Library

    题目大意 你需要保证第\(i\)天时有第\(a_i\)种书.你可以在任何一天买书,买第\(i\)种书的代价为\(c_i\). 你最多同时拥有\(k\)本书,如果此时再买书,则必须先扔掉已拥有的一本书. ...

  3. docker registry 镜像删除

    registry:2.5.0版本的镜像,将镜像默认存放在了/var/lib/registry 目录下 /var/lib/registry/docker/registry/v2/repositories ...

  4. 反射ORM 三层(for oracle)

    sql server and oracle 不同之处只在于: 1·参数@和: 2·自增和序列 3·oracle使用了存储过程以获得当前插入数据的ID DAL层的ORM using Oracle.Dat ...

  5. php用zendstudio建立wsdl

    首先,新建的时候要选择soap,然后deocument和rpc都可以. 类和方法的页面: <?php //发货接口 class test{ function send_do_delivery($ ...

  6. Java类与继承

      Java:类与继承 对于面向对象的程序设计语言来说,类毫无疑问是其最重要的基础.抽象.封装.继承.多态这四大特性都离不开类,只有存在类,才能体现面向对象编程的特点,今天我们就来了解一些类与继承的相 ...

  7. 【转】 Pro Android学习笔记(八一):服务(6):复杂数据Parcel

    目录(?)[-] 自定义的Parcelable类 AIDL文件 服务的实现 Client的实现 同步和异步     文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处 ...

  8. java继承 子类重写父类方法

    package com.addd; //多态 public class Sld { private String name = "zhangsan"; public Sld() { ...

  9. java代码继承基础

    总结:继承是java编程的核心,我搞不明白,子类对象调用父类的成员方法时.父类的带参构造方法有什么用,还赋值了 package com.bc; //普通类 public class yt { publ ...

  10. mybatis sql中的条件语句

    1.mybatis判断是否为空或null <if test="type!=null and type!=''"> AND type = #{type} </if& ...