堆的性质堆是一棵完全二叉树,实际中可以通过一个数组来实现,它最重要的一个性质是:任意节点都小于(大于)等于其子节点。将根节点最小的堆称为最小堆,根节点最大的堆称为最大堆。下图给出了一个最大堆的示例及其数组表示,可以直观地看出每个节点都比它的孩子们都要大。

在上图中可以看到,完全二叉树的节点可以从根节点编号为1开始按顺序排列,对应数组A中的索引(注意此处下标是从1开始的)。给定一个节点i,我们很容易可以得到它的左孩子是2i,右孩子是2i+1,父节点是i/2

堆的基本操作堆有两种基本操作(下面以最小堆为例):

插入元素k:直接将k添加到数组最后,然后向上冒泡(bubble-up)调整堆。向上冒泡操作:将要调整的元素与其父节点比较,如果大于其父节点则交换,直到恢复堆的性质。

提取最值:最值即根元素。然后将其删除,令根元素=最后的叶子结点元素,然后从根元素开始向下冒泡(bubble-down)调整堆。向下冒泡操作:每次应该从要调整节点,其左右孩子一共三个节点中选择最小的子节点来交换(如果最小就是其本身就不用交换),直到恢复堆的性质。

实际中经常需要将一个包含n个元素无序数组建立成堆,下面的Heap类中的构造方法将展示如何通过_bubbleDown向下冒泡调整来建堆。堆实质上是一棵完全二叉树,树高总为lognlog⁡n,每种基本操作的耗时操作都在于冒泡调整以满足堆的性质,因此它们的时间复杂度都是O(nlogn)O(nlog⁡n)。

Java示例:

//上浮

public void swim(int k){

while(k/2>=1 && less(pq[k/2],pq[k])){

exch(pq,k/2,k);

k=k/2;

}

}

//下沉

private void sink() {

int k=1;

while(2*k

int j=2*k;

if(less(pq[j],pq[j+1])) j++;

if(less(pq[k],pq[j])) exch(pq,k,j);

else break;

k = j;

}

}

堆排序实现原理分为两步:

1.把数组排成二叉堆的顺序

2.调换根节点和最后一个节点的位置,然后对根节点进行下沉操作。

实现:

可能我的代码和上面的动画略有出入,不过基本原理差不多。

public class HeapSort extends BaseSort {

private int N;

@Override

public void sort(Comparable[] a) {

N =a.length-1;

int k = N/2;

while(k>=1){

sink(a,k);

k--;

}

k = 1;

while(k<=N){

exch(a,k,N--);

sink(a,k);

}

}

}

java实现堆栈排序_Java代码为例讲解堆的性质和基本操作以及排序方法相关推荐

  1. Java编码技巧之高效代码50例

    来自:高德技术 导读:世界上只有两种物质:高效率和低效率:世界上只有两种人:高效率的人和低效率的人.--萧伯纳 同理,世界上只有两种代码:高效代码和低效代码:世界上只有两种人:编写高效代码的人和编写低 ...

  2. java中堆栈内存_Java堆空间与堆栈– Java中的内存分配

    java中堆栈内存 Sometime back I wrote a couple of posts about Java Garbage Collection and Java is Pass by ...

  3. java 内存分配实例_java内存管理实例讲解

    一.java虚拟机运行时内存分配图 二.栈 堆 方法区简介 1.栈 1. 每个方法被调用都会创建一个栈帧(存储局部变量.操作数.方法出口等) 2. JVM为每个线程创建一个栈,用于存放该线程执行方法的 ...

  4. Java实现Linux的md5加密,Linux_详细讲解:Linux系统GRUB的MD5加密方法,1、用grub-md5-crypt成生GRUB的md5密 - phpStudy...

    详细讲解:Linux系统GRUB的MD5加密方法 1.用grub-md5-crypt成生GRUB的md5密码: 通过grub-md5-crypt对GRUB的密码进行加密码运算,比如我们想设置grub的 ...

  5. java 拼音 排序_java代码按照中文拼音顺序排序_集合按照本地语言排序

    java代码中集合list需要前段排序,如何安装中文字母顺序排,或者安装日语顺序排序 需要使用Collator类 代码如下: import java.text.Collator; import jav ...

  6. java程序优化快捷键_Java 代码中针对性能优化的总结方案

    在一个好的项目中代码优化是永远离不开的话题,如果有充足的时间开发和维护代码,必须考虑每个可以优化的细节,日积月累,项目的质量才会上升,代码优化是绝对有必要的工作.代码优化的主要目的是减少代码块,提升代 ...

  7. java异常统一处理_Java 代码中的全局异常处理

    最近接手一个新项目,写用例的时候去翻看代码,发现部分代码里缺少基本的异常处理,包括对参数异常以及业务异常的处理.对照之前负责过的异常处理做得比较好的项目,给开发提了几点建议,顺便又去翻看了之前项目的代 ...

  8. 获取java异常堆栈信息_Java 实例 - 获取异常的堆栈信息

    全屏 Java 实例 - 获取异常的堆栈信息 以下实例演示了使用异常类的 printStack() 方法来获取堆栈信息: Main.java 文件public class Main{ public s ...

  9. java 不要使用魔法值_Java代码中的魔法值

    所谓魔法值,是指在代码中直接出现的数值,只有在这个数值记述的那部分代码中才能明确了解其含义. 1. 前言 重构老代码中遇到了不少类似下面这种写法: public void attend(String ...

  10. java中英文汉语混合排序_Java编程实现中英混合字符串数组按首字母排序的方法...

    本文实例讲述了Java编程实现中英混合字符串数组按首字母排序的方法.分享给大家供大家参考,具体如下: 在Java中对于字符串数组的排序,我们可以使用Arrays.sort(String[])方法很便捷 ...

最新文章

  1. 记录低频的混沌电压波形-双晶体管混沌信号
  2. org 07c00h的原因
  3. php使用supervisor管理进程脚本
  4. Convolutional Neural Networks for Visual Recognition 8
  5. SQLPLUS命令使用大全
  6. 用GCD线程组与GCD信号量将异步线程转换为同步线程
  7. Effective C++学习第八天
  8. The used SELECT statements have a different number of columns 错误解决
  9. 腾讯开奖,应届生年薪40万,白菜价,薪资倒挂!
  10. 技术分享PPT整理(一):Bootstrap基础与应用
  11. 使用APICloud AVM多端框架开发课程表功能
  12. fastjson 1.2.24 反序列化导致任意命令执行漏洞
  13. 威廉玛丽学院计算机专业,威廉玛丽学院CS排名2020年掌握的流程盘点
  14. 使用TTP224触摸芯片时出现的一些问题
  15. 【翻译】案例研究:Slite如何利用谷歌云建立先进的GitOps实践
  16. 线上教学软件哪个平台好?
  17. Elasticsearch(七) - X-Pack 用户管理
  18. SCSS 中这些实用技巧,你可能还不知道!
  19. 5、数码相框之使用多种方法支持多输入
  20. CUDA:CUDA转OPENGL的实例

热门文章

  1. React 路由 中 BrowserHistory 刷新报404
  2. 直连AIX服务器,对接AIX链路问题
  3. pandas dataframe遍历_Pandas循环提速7万多倍!Python数据分析攻略!
  4. ASP.NET Core中返回 json 数据首字母大小写问题
  5. SQLserver C#将图片以二进制方式存储到数据库,再从数据库读出图片
  6. nginx反向代理:配置多个应用通过80端口访问(PHP项目)
  7. Linux下从零搭建WordPress
  8. Mysql update 语句(chm文档)
  9. ADB Interface显示黄色惊叹号怎么办?
  10. 面试考知识点,吾亦很难通过