十大排序算法之——堆排序算法(Java实现)及思路讲解

堆排序是一种非常有效的排序算法,它利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。堆排序可以分为两个主要部分:建堆和堆调整。

以下是Java实现堆排序的详细过程,我会尽量控制在1500字以内:

首先,我们定义堆排序的主体类,并声明一些必要的变量和方法:

public class HeapSort {public void sort(int[] arr) {int len = arr.length;// 第一步:构建大顶堆buildMaxHeap(arr, len);// 第二步:进行堆排序for (int i = len - 1; i > 0; i--) {// 将当前最大元素 arr[0] 与末尾元素交换swap(arr, 0, i);// 重新对剩余元素构建大顶堆maxHeapify(arr, 0, i);}}// 构建大顶堆private void buildMaxHeap(int[] arr, int len) {for (int i = len / 2 - 1; i >= 0; i--) {maxHeapify(arr, i, len);}}// 调整大顶堆private void maxHeapify(int[] arr, int i, int len) {int left = 2 * i + 1;int right = 2 * i + 2;int largest = i;if (left < len && arr[left] > arr[largest]) {largest = left;}if (right < len && arr[right] > arr[largest]) {largest = right;}if (largest != i) {swap(arr, i, largest);maxHeapify(arr, largest, len);}}// 交换数组中的两个元素private void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}
}

上述代码中,sort方法是堆排序的入口,它首先调用buildMaxHeap方法构建一个大顶堆,然后依次将堆顶元素(即当前最大元素)与末尾元素交换,并对剩余元素重新构建大顶堆,直到所有元素排序完成。

buildMaxHeap方法从最后一个非叶子节点开始,依次向前遍历,对每个节点调用maxHeapify方法进行堆调整,以确保每个节点的子树都满足大顶堆的性质。

maxHeapify方法是堆调整的核心,它首先找出当前节点及其子节点中的最大元素,如果最大元素不是当前节点,则交换当前节点和最大元素,并对交换后的子树递归调用maxHeapify方法进行堆调整。

swap方法是一个辅助方法,用于交换数组中的两个元素。

现在,我们可以使用上述的HeapSort类来进行堆排序:

public class Main {public static void main(String[] args) {int[] arr = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};HeapSort heapSort = new HeapSort();heapSort.sort(arr);for (int i : arr) {System.out.print(i + " ");}}
}

运行上述代码,将会输出排序后的数组元素:1 1 2 3 3 4 5 5 5 6 9

堆排序的时间复杂度为O(nlogn),其中n为待排序元素的个数。由于堆排序是一种原地排序算法,其空间复杂度为O(1)。这使得堆排序在处理大规模数据时具有很高的效率。同时,堆排序是一种不稳定的排序算法,即相等的元素在排序后可能会改变其相对顺序。

总的来说,堆排序是一种非常有效且实用的排序算法,它在处理大规模数据时具有很高的效率,并且在实际应用中有着广泛的应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/4233.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【PG-2】PostgreSQL存储管理器

2. PostgreSQL存储管理器 src/backend/storage (base) torrestorresの机革:~/codes/postgresql-16.2/src/backend/storage$ ls Makefile buffer file freespace ipc large_object lmgr meson.build objfiles.txt page smgr sync存储管理器—smgr 通用存储管理器 …

航拍图像拼接 | 使用C++实现的无人机航拍图像拼接

项目应用场景 面向无人机航拍图像拼接场景&#xff0c;项目使用 C 实现&#xff0c;使用 harris 角点查找特征点 非极大值抑制&#xff0c;由于航拍图像没有严重的尺度旋转变化&#xff0c;使用了 berief 描述子&#xff0c;然后使用 RANSAC 求 H&#xff0c;最后进行图像拼接…

linux 中 make 和 gmake的关系

1. 关系 gmake特指GNU make。 make是指系统默认的make实现; 在大多数Linux发行版中&#xff0c;make就是GNU make&#xff0c;但是在其他unix中&#xff0c;gmake可以指代make的某些其他实现&#xff0c;例如BSD make或各种商业unix的make实现。 gmake是GNU Make的缩写。 Linux…

【算法一则】【贪心】数组中的数可以拼装成的最大数

题目 给定一组非负整数 nums&#xff0c;重新排列每个数的顺序&#xff08;每个数不可拆分&#xff09;使之组成一个最大的整数。 注意&#xff1a;输出结果可能非常大&#xff0c;所以你需要返回一个字符串而不是整数。 示例 1&#xff1a; 输入&#xff1a;nums [10,2] …

【UnityRPG游戏制作】RPG项目的背包系统商城系统和BOSS大界面

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

二分查找-在排序数组中查找元素的第一个和最后一个位置

给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示例 输入&#xf…

程序链接步骤2:重定位

一、链接步骤 链接步骤1“符号解析”&#xff1a; 将符号引用和符号定义建立关联后&#xff1b; 链接步骤2“重定位”&#xff1a; 将引用符号的地址“重定位”为相关联的符号定义的地址。 二、原文链接&#xff1a;https://www.jianshu.com/p/7d13ec4735ba 符号解析完成后&…

ZooKeeper 搭建详细步骤之二(伪集群模式)

ZooKeeper 搭建详细步骤之一&#xff08;单机模式&#xff09; ZooKeeper 及相关概念简介 伪集群搭建 ZooKeeper 伪集群是指在一个单一的物理或虚拟机环境中模拟出一个由多个 ZooKeeper 节点构成的集群。尽管这些节点实际上运行在同一台机器上&#xff0c;但它们通过配置不同的…

字节秋招高频算法汇总(高级篇)

更多大厂面试内容可见 -> http://11come.cn 字节秋招高频算法汇总 接下来讲一下 字节秋招 中的高频算法题&#xff0c;分为三个部分&#xff1a; 基础篇 、 中级篇 、 进阶篇 目的就是为了应对秋招中的算法题&#xff0c;其实过算法题的诀窍就在于 理解的基础上 背会 看…

【ARMv9 DSU-120 系列 5 -- CHI Interface】

请阅读【Arm DynamIQ™ Shared Unit-120 专栏 】 文章目录 DSU-120 CHI BUSAddress Target Groups配置步骤映射和管理Hashing for CHI transaction distribution散列过程和地址目标组识别散列函数定义两个地址目标组的散列四个地址目标组的散列八个地址目标组的散列架构框图

与Apollo共创生态:我和Apollo七周年大会的心路历程

一、写在前面 前几天观看了Apollo七周年大会&#xff0c;给我带来了超多的惊喜&#xff0c;博主想将这份惊喜分享给大家&#xff01; 二、Apollo开放平台 Apollo开放平台秉承其核心理念——开放能力、共享资源、加速创新、持续共赢&#xff0c;致力于推动自动驾驶技术的革新…

《HCIP-openEuler实验指导手册》1.2Apache主页面配置

一、配置服务器监听IP及端口 注释主配置文件“监听IP及端口”部分 cd /etc/httpd/conf cp httpd.conf httpd.conf.bak vim httpd.conf可以在普通模式下搜索Listen关键字 :/Listen按n键继续向后搜索 在/etc/httpd/conf.d中新建子配置文件port.conf&#xff1a; touch /etc…

新质生产力的内涵

新质生产力是以科技创新为先导&#xff0c;摆脱传统增长路径、符合高质量发展要求的生产力跃迁新形态&#xff0c;是数字时代更具有融合性、更体现新内涵的生产力组合。如果说传统生产力是人类已经掌握并正在使用的生产力&#xff0c;那么&#xff0c;新质生产力就是以大数据、…

Linux系统及工具的使用

​ Linux的版本系列与划分: Redhat与Debian系介绍(Linux各种发行版本概述)_酷炫人笨笨熊-CSDN博客_redhat和debian的区别 ubuntu下 1.打开 .bashrc文件&#xff0c; 在最后面添加下面一句话 Ubuntu 22.04下安装配置rime五笔输入法_ubuntu 22.04 五笔_繁星间漫步的博客-CSDN博客…

观成科技:蔓灵花组织加密通信研究分析总结

1.概述 蔓灵花&#xff0c;又名"Bitter"&#xff0c;常对南亚周边及孟加拉湾海域的相关国家发起网络攻击&#xff0c;主要针对巴基斯坦和中国两国。其攻击目标主要包括政府部门、核工业、能源、国防、军工、船舶工业、航空工业以及海运等行业&#xff0c;其主要意图…

笔记:Python 注释(练习题)

文章目录 前言一、Python 注释是什么&#xff1f;二、选择题二、填空题三、编程题总结 前言 欢迎来到Python注释练习&#xff01;在这个练习中&#xff0c;我们将探讨Python中注释的重要性和使用方法。注释在代码中扮演着关键的角色&#xff0c;不仅可以提高代码的可读性&…

火绒安全:全面守护你的数字世界

火绒安全&#xff1a;全面守护你的数字世界 在数字化时代的浪潮中&#xff0c;我们的电脑和生活已经紧密相连。然而&#xff0c;网络安全问题也如影随形&#xff0c;恶意软件、病毒、间谍软件等安全威胁层出不穷。作为一名国际著名的病毒程序软件专家&#xff0c;我深知一款高…

AI未来——从萌芽到智能新纪元

按照人工智能的发展阶段&#xff0c;具体的里程碑事件和细节: 人工智能的萌芽期(1940年代-1950年代) 1943年,麦卡洛克和皮茨发表题为《A Logical Calculus of Ideas Immanent in Nervous Activity》的论文,首次提出人工神经网络概念1950年,图灵在《计算机器与智能》一文中提出…

后端每日一题 2:DNS 解析过程

本文首发于公众号&#xff1a;腐烂的橘子 本文梗概&#xff1a; DNS 是什么&#xff0c;有什么作用一条 DNS 记录是什么样的DNS 域名解析原理DNS 服务器如何抵御攻击 DNS 是什么&#xff0c;有什么作用 DNS&#xff08;Domain Name System&#xff09;是一种应用层协议&…

JS高级 -- 数据类型

1. 分类 基本(值)类型 String&#xff1a;任意字符串Number&#xff1a;任意的数字Boolean&#xff1a;true / falseundefined&#xff1a;undefinednull&#xff1a;null 对象(引用)类型 Object&#xff1a;任意对象Function&#xff1a;一种特别的对象(可以执行)Array&am…