数据结构算法-堆排序

堆排序:利用堆的特性进行排序,先将数组转换为堆对象(最大堆或最小堆),以最大堆为例,每次heapify之后,取出堆顶(索引为0)的元素与最后一个元素交换。以后每次做同样的事情,只是堆的长度每次-1,直到1为止(最后一个元素不需要调整)。

堆排序流程

将数组调整为堆模型

我们以最大堆为例,传入一个无序的数组。先将其调整为堆最大堆模型,也就是最大值在第一个位置(树的根节点)。

定义数组存储待排序内容

public class HeapSort {private int[] elements; //堆的数组public HeapSort(int[] elements) {this.elements = elements;}}

定义heapify方法对数组调整大堆结构

  public void heapify(int curr,int size) {//1. 设置当前节点为最大节点int largest = curr;//2. 计算当前节点的左子节点,和右子节点int left = 2 * curr + 1;int right = 2 * curr + 2;// 3.1比较左子节点if (left < size && elements[left] > elements[largest]) {largest = left;}if (right < size && elements[right] > elements[largest]) {largest = right;}//交换largsetif (largest != curr) {int tmp = elements[largest];elements[largest] = elements[curr];elements[curr] = tmp;heapify(largest,size);}}

对数组使用堆排序

所谓堆排序,是我们将每次调整后的最大值(即堆的顶点即第一个元素)和最后一个元素进行调换,然后对除最后一个元素的所有元素继续按大堆进行调整。

   public void sort() {int len = elements.length;//数组长度每轮减一,将第一个元素移到从后向前的位置。while (len>1) {for(int i = len/2-1;i>=0;i--){heapify(i, len);}swap(0,--len);}}/*** 数组中的元素交换的方法*/ public void swap(int i,int j){int t = elements[i];elements[i] = elements[j];elements[j] = t;}/*** 打印数组元素*/
public void print() {System.out.println(Arrays.toString(this.elements));
}

测试排序

    public static void main(String[] args) {int[] a = {3, 9, 2, 1, 4, 5};System.out.println("init: " + Arrays.toString(a));HeapSort hs = new HeapSort(a);hs.sort();hs.print();}

在这里插入图片描述

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

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

相关文章

Golang性能分析工具pprof--远程分析时无法定位源代码行数问题解决方案

场景 通过命令行模式的list命令&#xff0c;为了查看指标消耗在具体哪一行&#xff0c;需要源代码。但实际程序是部署在线上或者程序的源代码目录变了&#xff0c;则pprof从默认路径找不到代码&#xff0c;无法显示是哪一行的问题。 通过浏览器模式的source页面&#xff0c;有…

JUC总结3

CAS 简介 CAS的全称是“比较并交换”&#xff0c;是一种无锁的原子操作&#xff0c;其体现了乐观所的思想&#xff0c;在无锁的情况下保证线程操作共享数据的原子性。 CAS一共有3个值&#xff1a; 1、V&#xff1a;要更新的值&#xff1b; 2、E&#xff1a;预期值&#xf…

RHCE (Linux进阶) Ubuntu 操作系统安装教程

一、在官网下载iso镜像文件 下载地址&#xff1a; https://cn.ubuntu.com/download/server/step1#downloads&#xff08;下载最新的Ubuntu 20.04 LTS服务器版本&#xff09; 二、VMware安装配置过程 基本安装过程 1、新建虚拟机 2、选择典型即可 3、设置下载好的Ubuntu对应路…

Exception异常机制详细讲解

目录 一、异常1.1 什么是异常1.2 异常机制的作用1.3 常见的异常2.3 异常的分类1. Error2. Exception① 运行时异常② 编译期异常总结&#xff1a; 二、异常的处理2.1 抛出异常3.1 抛出异常语法3.2 试图捕获异常3.3 捕获异常与抛出异常的区别1. 抛出异常2.捕获异常 三、finally四…

Spring Cloud:构建高可用分布式系统的利器

摘要&#xff1a;本文将介绍Spring Cloud&#xff0c;一个基于Spring Boot的开源微服务架构工具集。我们将探讨Spring Cloud的核心组件、特性以及如何使用Spring Cloud构建高可用、分布式系统。通过本文&#xff0c;读者将了解到Spring Cloud在实现微服务架构中的应用和优势。 …

【Springcloud微服务】MybatisPlus下篇

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;Springcloud微服务 &#x1f320; 首发时间&#xff1a;2024年6月4日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43…

24、matlab二维和三维网格(meshgrid函数)以及散点数据插值 griddata()函数

1、二维和三维网格(meshgrid函数) 语法 语法1:[X,Y] = meshgrid(x,y) 基于向量 x 和 y 中包含的坐标返回二维网格坐标。 语法2:[X,Y] = meshgrid(x) 与 [X,Y] = meshgrid(x,x) 相同,并返回网格大小为 length(x)length(x) 的方形网格坐标。 语法3:[X,Y,Z] = meshgrid(x,y,…

弘君资本炒股开户:如何看待股价波动?

在股票商场上股价的动摇无疑是投资者最为关心的话题之一&#xff0c;面临股价的起伏不定投资者往往会感到迷茫和焦虑。关于怎么看待股价动摇&#xff0c;弘君资本下面就为大家详细介绍一下。 股价动摇是股市运行的常态&#xff0c;股市是国民经济的晴雨表&#xff0c;股票价格…

SpringBoot+layui实现Excel导入操作

excel导入步骤 第三方插件引入插件 效果图 &#xff08;方法1&#xff09;代码实现&#xff08;方法1&#xff09;Html代码&#xff08; 公共&#xff09;下载导入模板 js实现 &#xff08;方法1&#xff09;上传文件实现 效果图&#xff08;方法2&#xff09;代码实现&#xf…

多语言大模型 Aya-23 开源!覆盖23种语言,性能刷新SOTA

文章目录 1. Aya-23 技术特点1.1 预训练阶段1.2 指令微调阶段 2. Aya-23 性能表现3. Aya-23 多语言任务评估4. Aya-23 支持 23 种语言5. Aya-23 应用场景 近年来&#xff0c;多语言大模型&#xff08;MLLM&#xff09;发展迅速&#xff0c;但大多数模型的性能依然存在显著差距&…

“滴滴打车,用友入账”,YonSuite商旅费控助力企业“降低成本”更进一步

在当今竞争激烈的商业环境中&#xff0c;企业对于成本控制和效率提升的需求日益迫切。特别是在商旅管理方面&#xff0c;如何有效整合资源、优化流程、降低费用&#xff0c;成为了成长型企业关注的焦点。用友YonSuite商旅费控作为用友集团旗下的重要产品&#xff0c;凭借其卓越…

ctfshow pwn17-18

毛坯的人生和精装的朋友圈 pwn17 while ( 1 ){menu();v4 0;puts("\nEnter the command you want choose:(1.2.3.4 or 5)\n");__isoc99_scanf("%d", &v4);switch ( v4 ){case 1:system("id");break;case 2:puts("Which directory?(/,…

卡尔曼滤波算法的matlab实现

卡尔曼滤波算法的matlab实现 figure; hold on;Z(1:1:100); %观测值&#xff1a;第一秒观测1m 第二秒观测两米 匀速运动, 每秒1m, 最后拟合的也是速度 1m/splot(Z); plot([0,100], [1,1]);noiserandn(1,100)*0.5; %生成方差为1的高斯噪声 ZZnoise; % 加入噪声plot(Z);X[0;…

LabVIEW动态力传感器校准系统

LabVIEW动态力传感器校准系统 开发了一种基于LabVIEW的动态力传感器校准系统。系统主要用于动态力的测量和校准&#xff0c;通过高度集成化和自动化的设计&#xff0c;显著提升校准的效率和精确度。系统采用冲击法进行动态校准&#xff0c;涵盖了完整的硬件设计和软件开发流程…

智能体应用开发:构建各类垂直领域的ai智能体应用

最近在做个类似的项目&#xff0c;有用到这方面的知识&#xff0c;顺便做一些记录和笔记吧&#xff0c;希望能帮到大家了解智能体应用开发 目录 引言 AI原生应用的兴起 智能体在AI中的角色 实现原理详解 机器学习基础 数据管理与关联数据库 数据结构 Embedding 检索方…

卫星位置解算

前言&#xff1a; 本章节代码均在Gitee中开源&#xff1a; 卫星位置计算代码https://gitee.com/Ehundred/navigation-engineering/tree/master/%E5%8D%AB%E6%98%9F%E5%AF%BC%E8%88%AA%E5%8E%9F%E7%90%86/GPS%E5%8D%AB%E6%98%9F%E4%BD%8D%E7%BD%AE%E8%A7%A3%E7%AE%97/Satellit…

心怀希望の光栅化

还记得什么是光栅化咩&#xff1f; 将三维空间的几何形体显现在屏幕上&#xff0c;这就是光栅化&#xff08;游戏、实时图形学的应用&#xff09; Perspective Projection 在正交投影里如何定义三维空间中的立方体呢&#xff1f; 用x轴的覆盖&#xff08;左、右&#xff09;…

【UML用户指南】-02-UML基本元素的介绍(二)

目录 1、语法和语义规则 2、UML中的公共机制 &#xff08;1&#xff09;规约 &#xff08;2&#xff09;修饰 &#xff08;3&#xff09;通用划分 &#xff08;4&#xff09;扩展机制 衍型/版型/类型&#xff08;stereotype&#xff09; 标记值 &#xff08;tagged val…

Java编程常见问题汇总四

系列文章目录 文章目录 系列文章目录前言一、忽略所有异常二、重复包装RuntimeException三、不正确的传播异常四、用日志记录异常五、异常处理不彻底 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。…

[C/C++]_[初级]_[在Windows和macOS平台上导出动态库的一些思考]

场景 最近看了《COM本质论》里关于如何设计基于抽象基类作为二进制接口,把编译器和链接器的实现隐藏在这个二进制接口中,从而使用该DLL时不需要重新编译。在编译出C接口时,发现接口名直接是函数名,比如BindNativePort,怎么不是_BindNativePort?说明 VC++导出的函数默认是使…