堆排序的详解

  • 一、堆是什么
  • 二、最大顶堆和最小顶堆
  • 三、堆排序的思想
  • 四、堆排序的java实现和详解

一、堆是什么

  1. 堆是一种数据结构,一般用一个数组表示,比如int[]
  2. 堆与数组的区别是: 堆的下标表示是由三个组成,分别是 n,2n+1,2n+2 其中
    n称为父节点2n+1称为左子节点2n+2称为右子节点
  3. 由于堆结构,把数据规划成一个图,类似树形结构 ,跟完全二叉树类似,所以,一个堆结构中,也会有根节点非叶子节点,叶子节点根节点指的是下标为0的数据,非叶子节点指的是既不是根节点,又含有子节点的数据。

二、最大顶堆和最小顶堆

每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图:

三、堆排序的思想

堆排序是基于堆这种数据结构的排序,一般基于最大堆进行排序,默认堆的根节点是最大值,所以获取最大值
的时间复杂度是O(1),而其他值是无序的,但是父节点一定大于子节点。堆排序的思想是,每次把最大值跟数
组里最后一个值交换,然后把剩下的数据当做一个新的堆,然后重新调整新堆为最大堆,然后再把最大值和倒
数第二位交换位置,依次循环执行。由于调整堆的方法是一样的,只需循环调用用调整的方法,传入不同的数
组长度值即可。详细请看以下的代码过程。

四、堆排序的java实现和详解

public static void main(String[] args) {int[] arr=new int[]{1,3,2,9,10,7,8,1,63,18,21,1,0,-1,99,100};sort(arr,false);  //正序 ,正序构建最大顶堆
//        sort(arr,true);  //反序 , 反序构建最小顶堆System.out.println(Arrays.toString(arr));}/*** 堆排序 主要分两步:* 第一步:构建最大顶堆。* 调整的顺序:自下而上,自左向右调整* 方法:从最大的非叶子的节点,开始调整* code:最大的非叶子的节点下标是  floor((n-1)/2)** 第二步:排序** 交换最大值到数组最后* 调整剩余的数组成的堆。**/public static void sort(int[] arr,boolean reverse){for (int i = arr.length/2-1; i >=0; i--) {       // 构建最大/小顶堆adjustHeap(arr,i,arr.length-1,reverse);}for (int i = arr.length-1; i >=0; i--) {swap(arr,0,i);                    //交换根节点和数组最后一个数adjustHeap(arr,0,i-1,reverse);  //从根节点开始重新调整}}/***  调整方法:* @param arr* @param current 当前节点* @param length*/public static void adjustHeap(int[] arr,int current,int length,boolean reverse){int li = (current << 1) + 1; // 左子节点索引  index * 2 +1int ri = li + 1;            // 右子节点索引  左子节点+1int temp = li;              //  子节点最大值的索引if (li > length) return;  // 子节点索引超出计算范围,直接返回。if(reverse){if (ri<=length && arr[ri] < arr[li]) {// 先判断左右子节点,哪个较小。temp = ri;                          //保存最小值的下标}if (arr[temp] < arr[current]) {         //比较当前节点和子节点的最小值swap(arr,temp,current);             // 交换位置adjustHeap(arr,temp,length,true); // 如果原有最小值还有子节点,向下递归,从下往上调整}}else {if (ri<=length && arr[ri] > arr[li]) {// 先判断左右子节点,哪个较大。temp = ri;  //保存最大值的下标}if (arr[temp] > arr[current]) { //比较当前节点和子节点的最大值,哪个大,交换位置swap(arr,temp,current);     // 交换位置adjustHeap(arr,temp,length,false); // 如果原有最大值还有子节点,向下递归,从下往上调整}}}/***  交换位置* @param arr* @param max* @param current*/public static void  swap(int[] arr,int max,int current){int temp=arr[max];arr[max]=arr[current];arr[current]=temp;}

详细解析堆排序java实现相关推荐

  1. 人工鱼群算法超详细解析附带JAVA代码

    01 前言 本着学习的心态,还是想把这个算法写一写,给大家科普一下的吧. 02 人工鱼群算法 2.1 定义 人工鱼群算法为山东大学副教授李晓磊2002年从鱼找寻食物的现象中表现的种种移动寻觅特点中得到 ...

  2. 2021 第十二届 蓝桥杯 国赛决赛 Java B组 真题 详细解析

    文章目录 2021 第十二届 Java B组 国赛 真题答案 详细解析 试题A: 整数范围 答案:255 分析: Code: 试题B: 纯质数 答案:1903 分析: Code: 试题C: 完全日期 ...

  3. Java中如何实现数组反转,将数组元素倒过来排列?【含详细解析】

    Java中如何实现数组反转,将数组元素倒过来排列?[含详细解析] 数组元素反转:本来的样子{1,2,3,4,5},反转后{5,4,3,2,1}.要求,不能使用新数组. 分析过程 数组元素反转其实就是对 ...

  4. 靠java_基础不牢靠,何以争朝夕?Java基础面试82道详细解析!(一)

    基础不牢靠,何以争朝夕?Java基础面试82道详细解析!(一) 发布时间:2020-03-31 12:08:31 来源:51CTO 阅读:229 作者:wx5d9ed7c8443c3 题目的基本顺序是 ...

  5. java 网络编程详细解析

    文章目录 java 网络编程详细解析 网络编程的常识 七层网络模型 相关的协议(笔试题) 协议的概念 TCP协议 UDP协议 IP地址(重点) 查看IP地址的方式: 特殊的地址 端口号(重点) 基于t ...

  6. java菜单项_java中菜单条和菜单项,详细解析

    在java作为一门非常重要的编程语言,在我们的日常使用中还是非常好用的,而且功能也是十分强大的.java中有很多的繁琐的基础知识,今天为大家介绍一下有关于菜单条和菜单项的内容,一起来看看吧. 首先说一 ...

  7. Java详细解析之Bean作用域

    本篇文章给大家带来了关于java的相关知识,Spring 框架作为一个管理 Bean 的 IoC 容器,那么 Bean 自然是 Spring 中的重要资源了,那 Bean 的作用域是什么意思?又有几种 ...

  8. java 类型检查_Java开发对象类型检查详细解析

    原标题:Java开发对象类型检查详细解析 前面介绍了类的多态性,来自于鸡类的实例chicken,既能用来表达公鸡实例,也能用来表达母鸡实例.可是这导致了一个问题,假如在call方法内部需要手工判断输入 ...

  9. java Unsafe获取实例详细解析

    问题 1)Unsafe是什么? Unsafe作用是使用堆外内存,详情可以参考原文 2)Unsafe只有CAS的功能吗? 3)Unsafe为什么是不安全的? 4)怎么使用Unsafe? 简介 Unsaf ...

  10. spark word2vec 源码详细解析

    spark word2vec 源码详细解析 简单介绍spark word2vec skip-gram 层次softmax版本的源码解析 word2vec 的原理 只需要看层次哈弗曼树skip-gram ...

最新文章

  1. Angular 4 依赖注入教程之一 依赖注入简介
  2. C++逆流而上,Java 惨不忍睹 | 9月编程语言排行
  3. strdup() - 它在C中做了什么?
  4. python基础教程第三版电子版百度云-《python基础教程第三版》高清版PDF免费下载...
  5. STM32 MDK编译后生成的 .map文件深入分析
  6. 伤疤好了有黑印怎么办_春藤家长圈|家有二孩,老大老二一起抢东西,家长该怎么办?...
  7. Arm 与中国联通成功部署物联网设备管理平台解决方案
  8. linux tomcat配置https
  9. MySQL order by、group by关键字优化
  10. 为什么要学习数据库,数据库有什么作用呢,以及为什么要选mysql
  11. delphi获取本机IP地址
  12. 7-2 古风排版 C语言
  13. 顺序查找与二分查找时间复杂度的比较
  14. 学会Zynq(11)RAW API的TCP和UDP编程
  15. PMP是不是要考第七版了?
  16. 笔记本计算机硬件知识,笔记本电脑硬件配置全解析,看完让你轻松选购笔记本电脑...
  17. Android 11 适配指南
  18. 红外热成像传感器介绍
  19. 硕士研究生毕业答辩ppt攻略
  20. 在Xubuntu 22.04安装中文输入法

热门文章

  1. Top 10 tough core Java interview questions answers programming
  2. 操作系统——Windows 控制台命令
  3. 自动开关机软件哪个好?自动开关机软件盘点
  4. 软件测试流程改进的几点看法
  5. 计算机怎么算对数的反函数,Excel 计算对数分布函数反函数:LOGINV函数
  6. 深入浅出python机器学习——K最邻近算法(K-Nearest Neighbors,KNN)
  7. 数字通信系统的组成框图
  8. 2021认证杯(小美赛)思路分析
  9. java课程设计仓库管理系统_Java课程设计-仓库管理系统
  10. 一文看懂NXP汽车电机控制解决方案(NXP整理)