数据结构与算法(Java版)_堆
完全二叉树叫做堆。
完全二叉树就是最后一个节点之前不允许有不满的节点,就是不允许有空洞。
可以使用数组来做完全二叉树(堆)。
堆分为大顶堆和小顶堆。大顶堆就是根节点上的数字是最大的,小顶堆就是根节点上的数字是最小的堆。
在堆里面的操作包括两种:插入新的节点和删除根节点。
插入新节点的操作时向上渗透。删除根节点的操作是向下渗透。
插入新节点时,把新的节点插入到最后一个位置,然后慢慢向上渗透(和父辈交换)。删除根节点时,把最后一个节点放到根节点上,然后再慢慢向下渗透(和子代交换)。
下面使用Java写一个大顶堆。
- package Heap;
- public class MaxHeap {
- private int[] heapArray;
- private int maxSize;
- private int currentSize;
- /*构造函数*/
- public MaxHeap(int mx) throws Exception {
- if(mx < 1) throw new Exception("max size must be >=1");
- maxSize = mx;
- currentSize = 0;
- heapArray = new int[maxSize];
- }
- /*向上渗透,index为下标*/
- private void trickleUp(int index){
- int parent = (index - 1) / 2;
- int bottom = heapArray[index];
- while(index>0 && heapArray[parent]<bottom){
- heapArray[index] = heapArray[parent];
- index = parent;
- parent = (parent - 1) / 2;
- }
- heapArray[index] = bottom;
- }
- /*向下渗透*/
- private void trickleDown(int index){
- int largerChild;
- int top = heapArray[index];
- while(index < currentSize / 2){
- int leftChild = 2 * index + 1;
- int rightChild = 2 * index + 2;
- if(rightChild<currentSize && heapArray[leftChild]<heapArray[rightChild])
- largerChild = rightChild;
- else
- largerChild = leftChild;
- if(top >= heapArray[largerChild])
- break;
- heapArray[index] = heapArray[largerChild];
- index = largerChild;
- }
- heapArray[index] = top;
- }
- public boolean IsEmpty(){
- return currentSize == 0;
- }
- public void Push(int num) throws Exception{
- if(currentSize == maxSize) throw new Exception("MaxHeap id full");
- heapArray[currentSize] = num;
- trickleUp(currentSize);
- currentSize++;
- }
- public int Top(){
- return heapArray[0];
- }
- public void Pop(){
- heapArray[0]=heapArray[--currentSize];
- trickleDown(0);
- }
- public static void main(String[] args) throws Exception {
- System.out.println("测试大顶堆");
- MaxHeap maxHeap = new MaxHeap(100);
- System.out.println(maxHeap.IsEmpty());
- maxHeap.Push(20);
- maxHeap.Push(30);
- maxHeap.Push(40);
- System.out.println(maxHeap.Top());
- maxHeap.Push(90);
- maxHeap.Push(80);
- maxHeap.Push(70);
- System.out.println(maxHeap.Top());
- maxHeap.Pop();
- System.out.println(maxHeap.Top());
- maxHeap.Pop();
- System.out.println(maxHeap.Top());
- maxHeap.Pop();
- System.out.println(maxHeap.Top());
- }
- }
堆排序就是迭代弹出栈顶元素。
堆排序的时间复杂度是O(nlogn).
数据结构与算法(Java版)_堆的更多相关文章
- 数据结构与算法Java描述 队列
package com.cjm.queue; /** * 数据结构与算法Java实现 队列 * * @author 小明 * */ public class Myqueue { private Nod ...
- 北京大学公开课《数据结构与算法Python版》
之前我分享过一个数据结构与算法的课程,很多小伙伴私信我问有没有Python版. 看了一些公开课后,今天特向大家推荐北京大学的这门课程:<数据结构与算法Python版>. 课程概述 很多同学 ...
- 数据结构与算法 java描述 第一章 算法及其复杂度
目录 数据结构与算法 java描述 笔记 第一章 算法及其复杂度 算法的定义 算法性能的分析与评价 问题规模.运行时间及时间复杂度 渐进复杂度 大 O 记号 大Ω记号 Θ记号 空间复杂度 算法复杂度及 ...
- 【数据结构与算法Python版学习笔记】引言
学习来源 北京大学-数据结构与算法Python版 目标 了解计算机科学.程序设计和问题解决的基本概念 计算机科学是对问题本身.问题的解决.以及问题求解过程中得出的解决方案的研究.面对一 个特定问题,计 ...
- 排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题
常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结 ...
- 【数据结构与算法Python版学习笔记】树——利用二叉堆实现优先级队列
概念 队列有一个重要的变体,叫作优先级队列. 和队列一样,优先级队列从头部移除元素,不过元素的逻辑顺序是由优先级决定的. 优先级最高的元素在最前,优先级最低的元素在最后. 实现优先级队列的经典方法是使 ...
- 数据结构Java版之堆&堆排序(九)
堆分为大顶堆,和小顶堆. 什么是堆? 堆可以看成是一棵二叉树,二叉树的元素是一个数组不断的从左到右轮训放置.如果是大顶堆,则大的数放上面一层,小的数放下面一层.上一层的数,一定大于下一层的数.小顶堆则 ...
- 常用排序算法--java版
package com.whw.sortPractice; import java.util.Arrays; public class Sort { /** * 遍历一个数组 * @param sor ...
- 排序算法系列:插入排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)
在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 我总结一个清晰不罗嗦版: 原理: 和选择排序类似的是也分成“已排序”部分,和“未排 ...
- 排序算法系列:选择排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)
在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 我总结一个清晰不罗嗦版: 原理: 从数组头元素索引i开始,寻找后面最小的值(比i位 ...
随机推荐
- 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 ...
- Codeforces 802 ABC. Heidi and Library
题目大意 你需要保证第\(i\)天时有第\(a_i\)种书.你可以在任何一天买书,买第\(i\)种书的代价为\(c_i\). 你最多同时拥有\(k\)本书,如果此时再买书,则必须先扔掉已拥有的一本书. ...
- docker registry 镜像删除
registry:2.5.0版本的镜像,将镜像默认存放在了/var/lib/registry 目录下 /var/lib/registry/docker/registry/v2/repositories ...
- 反射ORM 三层(for oracle)
sql server and oracle 不同之处只在于: 1·参数@和: 2·自增和序列 3·oracle使用了存储过程以获得当前插入数据的ID DAL层的ORM using Oracle.Dat ...
- php用zendstudio建立wsdl
首先,新建的时候要选择soap,然后deocument和rpc都可以. 类和方法的页面: <?php //发货接口 class test{ function send_do_delivery($ ...
- Java类与继承
Java:类与继承 对于面向对象的程序设计语言来说,类毫无疑问是其最重要的基础.抽象.封装.继承.多态这四大特性都离不开类,只有存在类,才能体现面向对象编程的特点,今天我们就来了解一些类与继承的相 ...
- 【转】 Pro Android学习笔记(八一):服务(6):复杂数据Parcel
目录(?)[-] 自定义的Parcelable类 AIDL文件 服务的实现 Client的实现 同步和异步 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处 ...
- java继承 子类重写父类方法
package com.addd; //多态 public class Sld { private String name = "zhangsan"; public Sld() { ...
- java代码继承基础
总结:继承是java编程的核心,我搞不明白,子类对象调用父类的成员方法时.父类的带参构造方法有什么用,还赋值了 package com.bc; //普通类 public class yt { publ ...
- mybatis sql中的条件语句
1.mybatis判断是否为空或null <if test="type!=null and type!=''"> AND type = #{type} </if& ...