详细解析堆排序java实现
堆排序的详解
- 一、堆是什么
- 二、最大顶堆和最小顶堆
- 三、堆排序的思想
- 四、堆排序的java实现和详解
一、堆是什么
- 堆是一种数据结构,一般用一个数组表示,比如int[]。
- 堆与数组的区别是: 堆的下标表示是由三个组成,分别是 n,2n+1,2n+2 其中
n称为父节点,2n+1称为左子节点,2n+2称为右子节点。 - 由于堆结构,把数据规划成一个图,类似树形结构 ,跟完全二叉树类似,所以,一个堆结构中,也会有根节点,非叶子节点,叶子节点。根节点指的是下标为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实现相关推荐
- 人工鱼群算法超详细解析附带JAVA代码
01 前言 本着学习的心态,还是想把这个算法写一写,给大家科普一下的吧. 02 人工鱼群算法 2.1 定义 人工鱼群算法为山东大学副教授李晓磊2002年从鱼找寻食物的现象中表现的种种移动寻觅特点中得到 ...
- 2021 第十二届 蓝桥杯 国赛决赛 Java B组 真题 详细解析
文章目录 2021 第十二届 Java B组 国赛 真题答案 详细解析 试题A: 整数范围 答案:255 分析: Code: 试题B: 纯质数 答案:1903 分析: Code: 试题C: 完全日期 ...
- Java中如何实现数组反转,将数组元素倒过来排列?【含详细解析】
Java中如何实现数组反转,将数组元素倒过来排列?[含详细解析] 数组元素反转:本来的样子{1,2,3,4,5},反转后{5,4,3,2,1}.要求,不能使用新数组. 分析过程 数组元素反转其实就是对 ...
- 靠java_基础不牢靠,何以争朝夕?Java基础面试82道详细解析!(一)
基础不牢靠,何以争朝夕?Java基础面试82道详细解析!(一) 发布时间:2020-03-31 12:08:31 来源:51CTO 阅读:229 作者:wx5d9ed7c8443c3 题目的基本顺序是 ...
- java 网络编程详细解析
文章目录 java 网络编程详细解析 网络编程的常识 七层网络模型 相关的协议(笔试题) 协议的概念 TCP协议 UDP协议 IP地址(重点) 查看IP地址的方式: 特殊的地址 端口号(重点) 基于t ...
- java菜单项_java中菜单条和菜单项,详细解析
在java作为一门非常重要的编程语言,在我们的日常使用中还是非常好用的,而且功能也是十分强大的.java中有很多的繁琐的基础知识,今天为大家介绍一下有关于菜单条和菜单项的内容,一起来看看吧. 首先说一 ...
- Java详细解析之Bean作用域
本篇文章给大家带来了关于java的相关知识,Spring 框架作为一个管理 Bean 的 IoC 容器,那么 Bean 自然是 Spring 中的重要资源了,那 Bean 的作用域是什么意思?又有几种 ...
- java 类型检查_Java开发对象类型检查详细解析
原标题:Java开发对象类型检查详细解析 前面介绍了类的多态性,来自于鸡类的实例chicken,既能用来表达公鸡实例,也能用来表达母鸡实例.可是这导致了一个问题,假如在call方法内部需要手工判断输入 ...
- java Unsafe获取实例详细解析
问题 1)Unsafe是什么? Unsafe作用是使用堆外内存,详情可以参考原文 2)Unsafe只有CAS的功能吗? 3)Unsafe为什么是不安全的? 4)怎么使用Unsafe? 简介 Unsaf ...
- spark word2vec 源码详细解析
spark word2vec 源码详细解析 简单介绍spark word2vec skip-gram 层次softmax版本的源码解析 word2vec 的原理 只需要看层次哈弗曼树skip-gram ...
最新文章
- Angular 4 依赖注入教程之一 依赖注入简介
- C++逆流而上,Java 惨不忍睹 | 9月编程语言排行
- strdup() - 它在C中做了什么?
- python基础教程第三版电子版百度云-《python基础教程第三版》高清版PDF免费下载...
- STM32 MDK编译后生成的 .map文件深入分析
- 伤疤好了有黑印怎么办_春藤家长圈|家有二孩,老大老二一起抢东西,家长该怎么办?...
- Arm 与中国联通成功部署物联网设备管理平台解决方案
- linux tomcat配置https
- MySQL order by、group by关键字优化
- 为什么要学习数据库,数据库有什么作用呢,以及为什么要选mysql
- delphi获取本机IP地址
- 7-2 古风排版 C语言
- 顺序查找与二分查找时间复杂度的比较
- 学会Zynq(11)RAW API的TCP和UDP编程
- PMP是不是要考第七版了?
- 笔记本计算机硬件知识,笔记本电脑硬件配置全解析,看完让你轻松选购笔记本电脑...
- Android 11 适配指南
- 红外热成像传感器介绍
- 硕士研究生毕业答辩ppt攻略
- 在Xubuntu 22.04安装中文输入法
热门文章
- Top 10 tough core Java interview questions answers programming
- 操作系统——Windows 控制台命令
- 自动开关机软件哪个好?自动开关机软件盘点
- 软件测试流程改进的几点看法
- 计算机怎么算对数的反函数,Excel 计算对数分布函数反函数:LOGINV函数
- 深入浅出python机器学习——K最邻近算法(K-Nearest Neighbors,KNN)
- 数字通信系统的组成框图
- 2021认证杯(小美赛)思路分析
- java课程设计仓库管理系统_Java课程设计-仓库管理系统
- 一文看懂NXP汽车电机控制解决方案(NXP整理)