Java数据结构与算法:排序算法之堆排序

Java数据结构与算法:排序算法之堆排序

大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,欢迎来到本专栏。在这寒冷的冬天,让我们一起点燃知识的火花,今天我们要探讨的主题是Java中一种高效的排序算法——堆排序。不仅仅是算法,更是排序的魔法!

堆排序简介

堆排序是一种基于二叉堆数据结构的选择排序算法。堆是一个可以被看做近似完全二叉树的数组,它满足堆的性质:父节点的值总是大于或等于子节点的值。在堆排序中,我们通过建立一个最大堆(父节点值最大)或最小堆(父节点值最小)来实现升序或降序排序。

堆排序的基本步骤

  1. 构建堆: 将待排序的数组构建成一个二叉堆。

  2. 堆调整: 将堆顶元素(最大值或最小值)与堆的最后一个元素交换,然后对剩余的元素进行堆调整,使得剩余元素重新构成一个堆。

  3. 重复操作: 重复步骤2,直到堆的大小为1,排序完成。

堆排序Java实现

下面是一个简单的Java代码示例,演示了如何使用堆排序对一个整型数组进行升序排序:

import java.util.Arrays;public class HeapSort {public static void main(String[] args) {int[] array = {64, 34, 25, 12, 22, 11, 90};// 打印排序前的数组System.out.println("排序前的数组:" + Arrays.toString(array));// 执行堆排序heapSort(array);// 打印排序后的数组System.out.println("排序后的数组:" + Arrays.toString(array));}// 堆排序算法实现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);}}// 堆调整算法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);}}
}

堆排序的时间复杂度

堆排序的平均时间复杂度为O(n log n),其中n是待排序序列的长度。堆排序的优势在于它不需要额外的空间,具有稳定性。

通过这篇文章,你应该对堆排序有了初步的了解。如果你对Java数据结构与算法感兴趣,敬请关注我的专栏,将为你带来更多有趣、实用的知识。愿你在编程的道路上越走越远,风度翩翩!

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

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

相关文章

rk1126, 实现 yolov8 目标检测

基于 RKNN 1126 实现 yolov8 目标检测 Ⓜ️ RKNN 模型转换 ONNX yolo export model./weights/yolov8s.pt formatonnx导出 RKNN 这里选择输出 concat 输入两个节点 onnx::Concat_425 和 onnx::Concat_426 from rknn.api import RKNNONNX_MODEL ./weights/yolov8s.onnxRKNN_MOD…

MySQL 索引(下)

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL-进阶篇 &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现…

C++轮子 · STL关联容器

上一篇文章中我们简单的介绍了一下STL中的序列容器和容器适配器,这篇文章中我们将重点介绍STL中的关联容器(最后四个在概念上应该不是关联容器,但是因为和前面的容器联系太紧密,统一放在这里讲解),主要内容包括: std::setstd::mapstd::multi_mapstd::multi_setstd::unor…

推荐新版AI智能聊天系统网站源码ChatGPT NineAi

Nine AI.ChatGPT是基于ChatGPT开发的一个人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过学习和理解人类的语言来进行对话&#xff0c;还能根据聊天的上下文进行互动&#xff0c;真正像人类一样来聊天交流&#xff0c;甚至能完成撰写邮件、视频脚本、文案、翻译、代…

GoZero微服务个人探究之路(七)添加中间件、自定义中间件

说在前面 官方已经自己实现了很多中间件&#xff0c;我们可以方便的直接使用&#xff0c;不用重复造轮子了 开启方式可以看官方文档 中间件 | go-zero Documentation 实现自定义的中间件 在业务逻辑中&#xff0c;我们需要实现自定义功能的中间件 ------这里我们以实现跨源…

Typescript的类型推导与联合类型

考虑以下 TypeScript 代码片段&#xff1a; function processInput(input: string | number): void {if (typeof input "string") {console.log(Input is a string: ${input.toUpperCase()});} else if (typeof input "number") {console.log(Input is …

Spring+SprinMVC+MyBatis配置方式简易模板

SpringSprinMVCMyBatis配置方式简易模板代码Demo GitHub访问 ssm-tpl-cfg 一、SQL数据准备 创建数据库test&#xff0c;执行下方SQL创建表ssm-tpl-cfg /*Navicat Premium Data TransferSource Server : 127.0.0.1Source Server Type : MySQLSource Server Versio…

Linux ---- 小玩具

目录 一、安装&#xff1a; 1、佛祖保佑&#xff0c;永不宕机&#xff0c;永无bug 2、小火车 3、艺术字和其它 天气预报 艺术字 4、会说话的小牦牛 5、其他趣味图片 我爱你 腻害 英雄联盟 帅 忍 龙 你是猪 福 好运连连 欢迎 加油 想你 忘不了你 我错了 你…

细说JavaScript事件处理(JavaScript事件处理详解)

js语言的一个特色和就是它的动态性&#xff0c;即一时间驱动的方式对用户输入作出反应而不需要依赖服务器端程序。事件是指人机交互的结果&#xff0c;如鼠标移动、点击按钮、在表单中输入数据或载入新的Web洁面等。 一、什么是事件 1、事件类型 1.1、事件源 1.2、事件处理…

Node.js Stream.pipeline() Method

Why Stream.pipeline 通过流我们可以将一大块数据拆分为一小部分一点一点的流动起来&#xff0c;而无需一次性全部读入&#xff0c;在 Linux 下我们可以通过 | 符号实现&#xff0c;类似的在 Nodejs 的 Stream 模块中同样也为我们提供了 pipe() 方法来实现。 未使用 Stream p…

Java开发安全之:Unreleased Resource: Streams需确保流得到释放

Overview java 中的函数 getResponseBytes() 有时无法成功释放由 getInputStream() 函数分配的系统资源。 Details 程序可能无法成功释放某一项系统资源。 在这种情况下&#xff0c;在某些程序路径上&#xff0c;所分配的资源未释放。 资源泄露至少有两种常见的原因&#xf…

Pyro —— Understanding how pyro works

目录 Simulation fields Inside the Pyro Solver Colliders Pressure projection Simulation fields Pyro是纯体积流体解算器&#xff0c;表示流体状态的数据存于各种标量场和矢量场&#xff1b;Smoke Object会创建这些场&#xff0c;且能可视化这些场&#xff1b; vel场&…

【JavaEE】网络原理:网络中的一些基本概念

目录 1. 网络通信基础 1.1 IP地址 1.2 端口号 1.3 认识协议 1.4 五元组 1.5 协议分层 什么是协议分层 分层的作用 OSI七层模型 TCP/IP五层&#xff08;或四层&#xff09;模型 网络设备所在分层 网络分层对应 封装和分用 1. 网络通信基础 1.1 IP地址 概念:IP地址…

Java设计模式之工厂方法模式详解

Java设计模式之工厂方法模式详解 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在今天的篇章中&#xff0c;我们将深入探讨Java设计模式中的一种魔法&#xff0c;那…

C语言/c++指针详细讲解【超详细】【由浅入深】

指针用法简单介绍 指针&#xff0c;是内存单元的编号。 内存条分好多好多小单元&#xff0c;一个小单元有 8 位&#xff0c;可以存放 8 个 0 或 1&#xff1b;也就是说&#xff0c;内存的编号不是以位算的&#xff0c;而是以字节算的&#xff0c;不是一个 0 或 1 是一个编号&…

函数 - JS

基本语法 function 关键字&#xff1b;函数名&#xff0c;应简明扼要且具有描述性&#xff0c;没有函数名就是匿名函数&#xff1b;参数列表&#xff0c;个数≥0&#xff0c;小括号不能省略&#xff1b;函数体。 /* 基本语法 */ function 函数名(参数) { 函数体 }声明与调用 …

立体视觉几何(一)

1.什么是立体视觉几何 立体视觉对应重建&#xff1a; • 对应&#xff1a;给定一幅图像中的点pl&#xff0c;找到另一幅图像中的对应点pr。 • 重建&#xff1a;给定对应关系(pl, pr)&#xff0c;计算空间中相应点的3D 坐标P。 立体视觉&#xff1a;从图像中的投影恢复场景中点…

list下

文章目录 注意&#xff1a;const迭代器怎么写&#xff1f;运用场合&#xff1f; inserterase析构函数赋值和拷贝构造区别&#xff1f;拷贝构造不能写那个swap,为什么&#xff1f;拷贝构造代码 面试问题什么是迭代器失效&#xff1f;vector、list的区别&#xff1f; 完整代码 注…

React16源码: React中的reconcileChildIterator和reconcileChildrenArray的源码实现

reconcileChildIterator 和 reconcileChildrenArray 1 &#xff09;概述 在react更新某一个节点的时候&#xff0c;要根据这个节点&#xff0c;它的类型去获取它的children比如说如果是 Function Component&#xff0c;它要调用这个 component 计算出它的return的属性return的…

qt学习:QT对话框+颜色+文件+字体+输入

目录 概述 继承图 QColorDialog 颜色对话框 QFileDialog 文件对话框 保存文件对话框 QFontDialog 字体对话框 QInputDialog 输入对话框 概述 对于对话框的功能&#xff0c;在GUI图形界面开发过程&#xff0c;使用是非常多&#xff0c;那么Qt也提供了丰富的对话框类QDia…