本篇文章给大家带来的内容是java中什么是堆排序?堆排序介绍。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。堆排序介绍:

堆排序可以分为两个阶段。在堆的构造阶段,我们将原始数组重新组织安排进一个堆中;然后在下沉排序阶段,我们从堆中按顺序取出所有元素并得到排序结果。

1.堆的构造,一个有效的方法是从右到左使用sink()下沉函数构造子堆。数组的每个位置都有一个子堆的根节点,sink()对于这些子堆也适用,如果一个节点的两个子节点都已经是堆了,那么在该节点上调用sink()方法可以把他们合并成一个堆。我们可以跳过大小为1的子堆,因为大小为1的不需要sink()也就是下沉操作,有关下沉和上浮操作可以参考我写的优先队列那篇。

2.堆的排序,我们通过第一步操作构造了一个堆,在这个堆中,根节点永远是最大值的节点,所以我们把根节点的值与数组最后的值进行交换,在使用sink()下沉来维护堆的结构即可。

具体代码实现:public class PQSort{

public static void main(String[] args){

int[] a = {9,1,7,5,3,9,12,56,21,45};

sort(a);

for(int i=0;i

System.out.print(a[i]+" ");

}

}

//排序方法

public static void sort(int[] a){

int N = a.length-1;

//通过下沉操作构造堆,因为下标从0开始,所以子节点为2*k+1和2*k+2;

for(int k = (N-2)/2;k>=0;k--){

sink(a,k,N);

}

//通过不断把堆中最大值放到数组的后面来排序

while(N>0){

exch(a,0,N--);

sink(a,0,N);

}

}

//下沉函数

private static void sink(int[] a, int i, int n){

while(2*i+1<=n){

int j = 2*i+1;

if(j

if(a[i]>a[j]) break;

exch(a,i,j);

i=j;

}

}

//交换函数

private static void exch(int[] a, int i, int j){

int temp = a[i];

a[i] = a[j];

a[j] = temp;

}

}

运行结果:

java的堆排序_java中什么是堆排序?堆排序介绍相关推荐

  1. java B锁_Java中15种锁的介绍

    原标题:Java中15种锁的介绍 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容如下: 1.公平锁 / 非公平锁 2.可重入锁 / 不可重入锁 3.独享 ...

  2. java mod %区别_Java中 % 与Math.floorMod() 区别详解

    %为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...

  3. java show过时_Java中show() 方法被那个方法代替了? java编程 显示类中信

    你说的show是swing里的吧,在老版本中Component这个超类确实有show这个方法,而且这个方法也相当有用,使一个窗口可见,并放到最前面.在jdk5.0中阻止了这个方法,普遍用setVisi ...

  4. java判断类型_Java中类型判断的几种方式 - 码农小胖哥 - 博客园

    1. 前言 在Java这种强类型语言中类型转换.类型判断是经常遇到的.今天就细数一下Java中类型判断的方法方式. 2. instanceof instanceof是Java的一个运算符,用来判断一个 ...

  5. java 序列化实例_Java中的序列化与反序列化实例

    创建的字节流与平台无关.因此,在一个平台上序列化的对象可以在另一个平台上反序列化. 为了使Java对象可序列化,我们实现java.io.Serializable可序列化接口. ObjectOutput ...

  6. java中对象类型转换_Java中的对象的类型转换介绍(附代码)

    本篇文章给大家带来的内容是关于Java中的对象的类型转换介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 向上转型:子类对象转为父类,父类可以是接口.公式:Father ...

  7. java 数据类型分为_JAVA中分为基本数据类型及引用数据类型

    byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值 ...

  8. java 代码锁_Java中的Lock锁

    Lock锁介绍: 在java中可以使用 synchronized 来实现多线程下对象的同步访问,为了获得更加灵活使用场景.高效的性能,java还提供了Lock接口及其实现类ReentrantLock和 ...

  9. java wait 参数_java中wait()和join()方法的区别是什么

    java中wait()和join()方法的区别是:存在不同的java包中:wait()方法用于线程间通信,它所施加的等待状态的线程可以被启动:join()方法用于在多个线程之间添加排序,它所施加的等待 ...

  10. java thread join()_Java中Thread.join()的使用方法

    概要 本文分三个部分对thread.join()进行分析: 1. join() 的示例和作用 2. join() 源码分析 3. 对网上其他分析 join() 的文章提出疑问 1. join() 的示 ...

最新文章

  1. 【硬件基础】振荡(时钟)周期、状态周期、机械周期、指令周期
  2. cocos2d-lua 搓牌效果_4款热门面霜评测,欧莱雅效果一般,艾珂薇性价比高,菲洛嘉最贵...
  3. 自动化运维之 安装部署 Ansible 服务
  4. pip安装的库导入pycharm中
  5. 移动端(H5)弹框组件--简单--实用--不依赖jQuery
  6. 什么是全场景AI计算框架MindSpore?
  7. 【Elasticsearch】es Root mapping definition has unsupported parameters
  8. 获取Kubernetes容器上下文环境
  9. web端(js)极光IM获取消息记录时,如果是图片类型,如何通过media_id获取到图片的真实路径?
  10. 【第十八题】填坑I(北理工/北京理工大学/程序设计方法与实践/小学期 )
  11. IOS - Swift高德地图自定义标注、气泡
  12. Python也有对象了哈哈哈哈哈哈嗝
  13. 把北斗七星与北极星捡起来
  14. 台湾华夏堂古代玉器收藏家~件件珍贵难得一见
  15. 一年卖出20.4亿颗图像传感器,这家公司上市首日股价大涨145%
  16. 常见交通工具英语单词
  17. 前端应该知晓的PWA
  18. java图片加气泡文字_图片加气泡文字
  19. JQuery中的动画效果
  20. 基于javaweb的高校教职工差旅报销管理系统(java+ssm+jsp+html+mysql)

热门文章

  1. mutilprocess模块的用法
  2. Delphi 的信息框相关函数
  3. 【转】 NSArray copy 问题
  4. Nodejs开发框架Express3.0开发手记–从零开始
  5. 经典算法系列三----堆排序
  6. java Statement与preparedStatement的区别
  7. 测试方案和测试计划的区别
  8. Mr.J--C99标准之数组问题
  9. sql语句查询数据库中含有某字符串的表名
  10. 清理 Xcode 10