数据结构-堆排序Java实现

目录

  • 一、引言
  • 二、算法步骤
  • 三、原理演示
    • 步骤1: 构建最大堆
    • 步骤2: 交换和堆化
    • 步骤3: 排序完成
  • 四、代码实战
  • 五、结论

一、引言

    堆排序是一种利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

二、算法步骤

堆排序的核心是建立和维护一个二叉堆,通常是一个最大堆(Max Heap)或最小堆(Min Heap)。在最大堆中,根节点的值是最大的,而在最小堆中,根节点的值是最小的。堆排序的基本思路如下:

  1. 构建最大堆:将未排序的数组构建成一个最大堆。这通常需要从最后一个非叶子节点开始,逐步向前调整,使整个数组满足最大堆的性质。
  2. 交换和堆化:将最大堆的根节点与最后一个元素交换,然后减小堆的大小(即排除最后一个元素),再对根节点进行堆化操作,以保持最大堆的性质。
  3. 重复步骤2:重复执行步骤2,直到堆的大小减小到1,排序完成。

三、原理演示

堆排序是一种基于二叉堆数据结构的排序算法,它通过构建和维护一个最大堆(或最小堆)来对数组进行排序。在这里,我将动态说明堆排序的实现过程,以帮助您更好地理解它。

步骤1: 构建最大堆

假设我们有一个未排序的整数数组作为输入。第一步是将这个数组构建成一个最大堆,确保堆的性质:每个父节点的值都大于或等于其子节点的值。初始数组:
[4, 10, 3, 5, 1]
构建最大堆的过程:
从数组的中间元素开始,即索引为 n/2 - 1,这是最后一个非叶子节点。从这个节点向前遍历,执行堆化操作。
[4, 10, 3, 5, 1]
堆化过程:从根节点开始,比较它与其子节点的值,如果子节点的值更大,则交换它们,然后继续堆化子节点。
[10, 4, 3, 5, 1]
继续堆化直到整个数组成为最大堆。

步骤2: 交换和堆化

在第一步完成后,我们已经构建了一个最大堆,其中根节点包含最大的元素。现在,我们将根节点与最后一个元素交换,将最大元素放到正确的位置。交换和堆化的过程:
交换根节点和最后一个元素:
[1, 4, 3, 5, 10]
减小堆的大小,排除最后一个元素。
对根节点进行堆化操作,以保持最大堆性质。
[5, 4, 3, 1]
重复步骤1和步骤2,直到堆的大小减小到1,排序完成。

步骤3: 排序完成

最终,堆排序完成,数组中的元素按升序排列。
排序完成的数组:
[1, 3, 4, 5, 10]
这就是堆排序的整个过程。它的时间复杂度为O(nlogn),具有稳定性,适用于大型数据集的排序。堆排序的核心是构建和维护堆,确保最大(或最小)元素位于根节点,然后将根节点与数组末尾的元素交换,并逐渐减小堆的大小。

四、代码实战

下面我们使用java演示一下堆排序的过程:

public class HeapSort {public static void main(String[] args) {int[] arr = {12, 11, 13, 5, 6, 7};int n = arr.length;System.out.println("原始数组:");printArray(arr);heapSort(arr);System.out.println("排序后的数组:");printArray(arr);}public static void heapSort(int[] arr) {int n = arr.length;// 构建最大堆for (int i = n / 2 - 1; i >= 0; i--) {heapify(arr, n, i);}// 逐个提取元素并排序for (int i = n - 1; i >= 0; i--) {int temp = arr[0];arr[0] = arr[i];arr[i] = temp;heapify(arr, i, 0);}}public static void heapify(int[] arr, int n, int i) {int largest = i;int left = 2 * i + 1;int right = 2 * i + 2;if (left < n && arr[left] > arr[largest]) {largest = left;}if (right < n && arr[right] > arr[largest]) {largest = right;}if (largest != i) {int swap = arr[i];arr[i] = arr[largest];arr[largest] = swap;heapify(arr, n, largest);}}public static void printArray(int[] arr) {for (int value : arr) {System.out.print(value + " ");}System.out.println();}
}

上述代码演示了堆排序的实现。它首先定义了一个包含整数数组的示例,然后调用 heapSort 方法来对数组进行排序。heapSort 方法首先构建一个最大堆,然后进行排序。heapify 方法用于维护最大堆的性质。

五、结论

我们一起来总结一下:

  1. 堆排序是一种选择排序的变种,它将待排序序列划分成若干个子序列,每个子序列都满足堆积的性质,即子序列的最大值(或最小值)位于其顶部。
  2. 堆排序的时间复杂度为O(nlogn),其中n表示待排序序列的长度。这是因为堆排序需要将序列构造成堆,这需要O(nlogn)的时间复杂度,然后需要依次取出每个元素,这需要O(n)的时间复杂度。
  3. 堆排序的空间复杂度为O(1)。这是因为堆排序只需要在内存中使用常数级别的额外空间来完成排序。
  4. 堆排序是原地排序算法,也就是说,它不需要额外的存储空间,除了用于存储待排序序列本身的存储空间之外。
  5. 堆排序是稳定的排序算法,也就是说,它保持了相同元素的相对顺序。
  6. 堆排序适用于大规模数据的排序,特别是当内存空间有限时,因为它只需要常数级别的额外空间。
  7. 堆排序算法的实现比较简单,但理解和掌握它需要对数据结构和算法有较深入的理解。
    点赞收藏,富婆包养✋✋

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

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

相关文章

MySQL学习(八)——锁

文章目录 1. 锁概述2. 全局锁2.1 全局锁的必要性2.2 语法2.3 全局锁的特点 3. 表级锁3.1 表锁3.2 元数据锁3.3 意向锁3.4 自增锁 4. 行级锁4.1 介绍4.2 记录锁4.3 间隙锁4.4 临键锁 1. 锁概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传…

图像分割数据集的相关操作(二)—— albumentations 数据增强

前言 相比与torchvision 的 transform 库,albumentations 库提供了更丰富的增强操作和更高的性能;albumentations 通过使用 OpenCV 库实现增强操作,它采用了基于 NumPy 数组的处理方式,并通过并行化和内存优化来提高性能。相比之下,torchvision 的 transform 库是基于 Py…

2023亚马逊下半年的旺季选品攻略,黑五网一圣诞爆单机会不再错过

万圣节、黑五、网一和圣诞节是西方重要销售活动&#xff0c;也是跨境电商的一场重要考试&#xff0c;相对于国内的双十一双十二&#xff0c;这些节日的形成更为久远&#xff0c;需求也更加深入人心&#xff01;卖家需要根据市场需求和竞争情况选择细分品类&#xff0c;为更好的…

LabVIEW建立生产者消费者

LabVIEW建立生产者消费者 生产者/消费者设计模式由并行循环组成&#xff0c;这些循环分为两类&#xff1a;生产者循环和消费者循环。生产者循环和消费者循环间的通信可以使用队列或通道连线来实现。 队列 LabVIEW内置的队列操作VI可在函数选板>>数据通信>>队列操…

Atlas 200I DK目标检测与追踪技术记录

数据集 数据集采用MOT系列&#xff0c;MOT是多目标追踪常用数据集&#xff0c;MOT数据集对数据集进行了分帧&#xff0c;如要获得视频&#xff0c;需要先利用opencv里的cv2.VideoWriter模块便利图片文件夹&#xff0c;具体代码如下&#xff1a; import os import cv2img_path…

django cloudflare csrf 403

网站套了cloudflare flare发现登录接口403了&#xff0c;csrf验证失败&#xff0c; debug设置为False 详细报错如下&#xff1a; Reason given for failure: Referer checking failed - https://xxx/login does not match any trusted origins.In general, this can occur w…

Nginx正向代理,反向代理,负载均衡

Nginx正向代理&#xff0c;反向代理&#xff0c;负载均衡 Nginx当中有两种代理方式&#xff1a; 七层代理&#xff08;http协议&#xff09; 四层代理&#xff08;tcp/udp流量转发&#xff09; 七层代理&#xff1a;七层代理&#xff0c;代理的是http的请求和响应 客户端请求…

开源Vue盲盒商城4.0源码/网页盲盒源码/前端uniapp后端thinkphp+安装教程/亲测

源码简介&#xff1a; 开源Vue盲盒商城4.0源码&#xff0c;它是打包小程序app的网页盲盒源码,亲测可用&#xff0c;它是采用vueTP5框架开发开源盲盒网站源码&#xff0c;附带了安装教程。 简单测试过了&#xff0c;可以使用&#xff0c;大家可以自测下。 前端uniapp后端think…

Elasticsearch Relevance Engine---为AI变革提供高级搜索能力[ES向量搜索、常用配置参数、聚合功能等详解]

Elasticsearch Relevance Engine—为AI变革提供高级搜索能力[ES向量搜索、常用配置参数、聚合功能等详解] 今天要介绍的 Elasticsearch Relevance Engine™ (ESRE™)&#xff0c;提供了多项用于创建高度相关的 AI 搜索应用程序的新功能。ESRE 站在 Elastic 这个搜索领域的巨人…

数据库设计与前端框架

数据库设计与前端框架 学习目标&#xff1a; 理解多租户的数据库设计方案 熟练使用PowerDesigner构建数据库模型理解前端工程的基本架构和执行流程 完成前端工程企业模块开发 多租户SaaS平台的数据库方案 多租户是什么 多租户技术&#xff08;Multi-TenancyTechnology&a…

Python8-使用json模块解析JSON文件

Python8-使用json模块解析JSON文件 json简介json模块使用 json简介 JSON (JavaScript Object Notation) 是一种用于存储和交换数据的轻量级数据格式。是一种常用的数据格式&#xff0c;用于在不同应用程序之间交换数据。 JSON 文件由键值对组成&#xff0c;键和值之间使用冒号…

C++算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例

相关 源码测试用例下载 https://download.csdn.net/download/he_zhidan/88430716 包括4个压缩包&#xff0c;初始代码&#xff0c;实现前缀和&#xff0c;实现前缀积&#xff0c;实现前缀异或。都是在前者的基础上修改的。 本博文是CSDN学院课程的讲义 https://edu.csdn.net/c…

15.2 主机探测与路由追踪

Ping 使用 Internet 控制消息协议&#xff08;ICMP&#xff09;来测试主机之间的连接。当用户发送一个 ping 请求时&#xff0c;则对应的发送一个 ICMP Echo 请求消息到目标主机&#xff0c;并等待目标主机回复一个 ICMP Echo 回应消息。如果目标主机接收到请求并且网络连接正常…

【网络协议】聊聊从物理层到MAC层 ARP 交换机

物理层 物理层其实就是电脑、交换器、路由器、光纤等。组成一个局域网的方式可以使用集线器。可以将多台电脑连接起来&#xff0c;然后进行将数据转发给别的端口。 数据链路层 Hub其实就是广播模式&#xff0c;如果A电脑发出一个包&#xff0c;B、C电脑也可以收到。那么数据…

ZKP4.1 SNARKs via Interactive Proofs (Justin Thaler)

ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 4: SNARKs via Interactive Proofs (Justin Thaler) 4.1 Interactive Proofs: Motivation and Model Interactive Proofs P solves problem, tells V the answer. Then they have a conversation.P’s goal: convince V the …

1626 无矛盾的最佳球队(排序+动态规划)(灵神笔记)

题目 1626 假设你是球队的经理。对于即将到来的锦标赛&#xff0c;你想组合一支总体得分最高的球队。球队的得分是球队中所有球员的分数 总和 。 然而&#xff0c;球队中的矛盾会限制球员的发挥&#xff0c;所以必须选出一支 没有矛盾 的球队。如果一名年龄较小球员的分数 严…

java基础练习,九九乘法表(java版),计算器

简介 对于有了解&#xff0c;但是了解不深的同学&#xff0c;学习Java总是感觉一看就会&#xff0c;一些就废。往往需要一些实操练习&#xff0c;来夯实我们的学习结果。九九乘法表和计算器都是在编程学习领域比较经典的案例。本文为大家讲解一下两个基础练习涉及到一些基础知…

【黑夜送书第一期】好书来袭,AI时代程序员/项目经理开发之道送3本~

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

【广州华锐互动】VR高层小区安全疏散演练系统

在今天的高科技时代&#xff0c;虚拟现实&#xff08;VR&#xff09;技术已经被广泛应用到各个领域&#xff0c;包括教育和培训。由广州华锐互动定制开发的VR高层小区安全疏散演练系统&#xff0c;开始在房地产行业中崭露头角。这种系统通过模拟真实的紧急情况&#xff0c;帮助…

怎么使用动态代理IP提升网络安全,动态代理IP有哪些好处呢?

目录 一、什么是动态代理IP 二、动态代理IP的优势 三、动态代理IP的代码实现 1. 安装依赖库 2. 获取代理IP 3. 使用代理IP请求目标网站 4. 动态更换代理IP 五、总结 一、什么是动态代理IP 动态代理IP是指在网络通信过程中&#xff0c;代理服务器不是固定IP地址&#x…