你好!堆排序【JAVA】

news2024/11/18 3:44:10

目录

1.简单介绍

2.大小顶堆 

 3.基本思想

4.基本思路

4.代码实现数组转化堆

5.代码排序

6.总代码+测试


1.简单介绍

堆排序是一种基于堆数据结构的排序算法,其核心思路是利用堆这种特殊的数据结构来对数据进行排序。堆是一种完全二叉树,并且满足父节点的值大于等于(或小于等于)其子节点的值

2.大小顶堆 

 

  • 大顶堆:当前节点的值大于其左子节点和右子节点的值
  • 大顶堆特点:arr[i]>=arr[2*i+1] && arr[i]>=arr[2*i+2]
  • 小顶堆:当前节点的值小于其左子节点和右子节点的值
  • 小顶堆特点:arr[i]<=arr[2*i+1] && arr[i]<=arr[2*i+2]

注:升序采用大顶堆,降序采用小顶堆

 3.基本思想

  • 1.建堆:首先将待排序数组看作一棵完全二叉树,然后对树中每个非叶子节点进行堆化,即将其和其子节点的值进行比较,将较大(或较小)的值放到父节点上,然后递归地对子节点进行堆化,直到整个树变为一个堆。
  • 2.排序:排序的过程就是不断将堆顶的元素(最大值或最小值)取出并放到已经排好序的数组的末尾,然后将堆进行调整,保证堆的性质不变。不断取出堆顶元素并进行调整,直到堆为空,排序完成。

4.基本思路

  • 1.将无序序列构建成一个堆,根据升序降序需求选择大顶堆小顶堆
  • 2.将堆顶元素与末尾元素交换,将最大元素"沉"到数组末端;
  • 3.重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,直到整个序列有序。

4.代码实现数组转化堆

1.建堆

    /**
     * 将数组,调整一个大顶堆
     *
     * @param array:待调整的数组
     * @param i:非叶子节点在数组中的索引
     * @param length:表示对多少个元素进行调整,length逐减
     */
    public static void adjustHeapSort(int[] array, int i, int length) {
        int temp = array[i];//定义临时变量,保存当前值
        //调整
        //1.k=i*2+1:表示i节点的左子节点
        for (int k = i * 2 + 1; k < length; k = i * 2 + 1) {
            if (k + 1 < length && array[k] < array[k + 1]) {//说明左子节点小于右子节点
                k++;//k指向右子节点
            }
            if (array[k] > temp) {//子节点大于父节点,进行交换
                array[i] = array[k];//子节点赋给父节点
                i = k;
            } else {
                break;
            }
        }
        //结束for循环,已经将以i为父节点的树的最大值,放在了最顶端
        array[i] = temp;//将temp放到最后调整的位置
    }

5.代码排序

2.排序


        for (int j = array.length - 1; j > 0; j--) {
            int temp = array[j];
            array[j] = array[0];
            array[0] = temp;
            adjustHeapSort(array, 0, j);
        }

6.总代码+测试

 public static void main(String[] args) {
        int[] array = new int[]{4, 6, 8, 5, 9, 10, 7, -2};
        heapSort(array);
    }

    public static void heapSort(int[] array) {
        System.out.println("============分步代码============");
        adjustHeapSort(array, 1, array.length);
        System.out.println("第一次:" + Arrays.toString(array));
        adjustHeapSort(array, 0, array.length);
        System.out.println("第二次:" + Arrays.toString(array));

        //数组转化大顶堆
        System.out.println("============总代码=============");
        for (int i = array.length / 2 - 1; i >= 0; i--) {
            adjustHeapSort(array, i, array.length);
        }
        System.out.println("转换后大顶堆:" + Arrays.toString(array));

        for (int j = array.length - 1; j > 0; j--) {
            int temp = array[j];
            array[j] = array[0];
            array[0] = temp;
            adjustHeapSort(array, 0, j);
        }

        System.out.println("==========从小到大排序===========");
        System.out.println("从小到大:" + Arrays.toString(array));
    }

    /**
     * 将数组,调整一个大顶堆
     *
     * @param array:待调整的数组
     * @param i:非叶子节点在数组中的索引
     * @param length:表示对多少个元素进行调整,length逐减
     */
    public static void adjustHeapSort(int[] array, int i, int length) {
        int temp = array[i];//定义临时变量,保存当前值
        //调整
        //1.k=i*2+1:表示i节点的左子节点
        for (int k = i * 2 + 1; k < length; k = i * 2 + 1) {
            if (k + 1 < length && array[k] < array[k + 1]) {//说明左子节点小于右子节点
                k++;//k指向右子节点
            }
            if (array[k] > temp) {//子节点大于父节点,进行交换
                array[i] = array[k];//子节点赋给父节点
                i = k;
            } else {
                break;
            }
        }
        //结束for循环,已经将以i为父节点的树的最大值,放在了最顶端
        array[i] = temp;//将temp放到最后调整的位置
    }

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

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

相关文章

建筑可视化数据大屏汇总,UI源文件(PC端大屏设计)

酷炫的大屏设计让数据更好的展现&#xff0c;方便业务人员分析数据&#xff0c;辅助领导决策。现在分享大屏Photoshop源文件&#xff0c;以下为部分截图示意。 划重点&#xff1a;文末可获得完整素材包~ 01 科技建筑平台数据可视化 02 建筑公司可视化数据汇总平台 03 深蓝…

算法Day27 身材管理(三维背包)

身材管理&#xff08;三维背包&#xff09; Description Input Output Sample 代码 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt(); // 输入n的值int money sca…

TrustZone之完成器:外围设备和内存

到目前为止,在本指南中,我们集中讨论了处理器,但TrustZone远不止是一组处理器功能。要充分利用TrustZone功能,我们还需要系统其余部分的支持。以下是一个启用了TrustZone的系统示例: 本节探讨了该系统中的关键组件以及它们在TrustZone中的作用。 完成器:外围设备…

Docker创建镜像的方式---Dockerfile

Dockerfile可以创建自定义镜像。包括配置文件&#xff0c;挂载点&#xff0c;对外暴露的端口&#xff0c;设置环境变量。 Docker创建镜像的方式 1、 基于已有镜像创建&#xff1a;根据官方提供的镜像源&#xff0c;创建镜像。然后拉起容器。是一个白板智能提供基础的功能&…

【收获】成长之路

目录 一、前言二、计算机方面三、专业知识方面四、总结 一、前言 四年&#xff0c;对于一个人的成长来说&#xff0c;是一个相当重要的阶段。在这段时间里&#xff0c;我经历了许多挑战、收获了许多成就&#xff0c;也在不断地成长和改变。回首这四年的点点滴滴&#xff0c;我深…

mybatis多表映射-延迟加载,延迟加载的前提条件是:分步查询

1、建库建表 create database mybatis-example; use mybatis-example; create table t_book (bid varchar(20) primary key,bname varchar(20),stuid varchar(20) ); insert into t_book values(b001,Java,s001); insert into t_book values(b002,Python,s002); insert into …

牛客网(二叉树)

https://www.nowcoder.com/practice/4b91205483694f449f94c179883c1fef?tpId60&&tqId29483&rp1&ru/activity/oj&qru/ta/tsing-kaoyan/question-ranking 这个题目和leetcode比起来就是有一些不一样&#xff0c;需要我们自己来写接口函数&#xff0c;所以…

Linux系统编程(一):基本概念

参考引用 Unix和Linux操作系统有什么区别&#xff1f;一文带你彻底搞懂posix Linux系统编程&#xff08;文章链接汇总&#xff09; 1. Unix 和 Linux 1.1 Unix Unix 操作系统诞生于 1969 年&#xff0c;贝尔实验室发布了一个用 C 语言编写的名为「Unix」的操作系统&#xff0…

鸿蒙原生应用/元服务开发-Stage模型能力接口(二)

ohos.app.ability.AbilityConstant (AbilityConstant)一、说明 AbilityConstant提供Ability相关的枚举&#xff0c;包括设置初次启动原因、上次退出原因、迁移结果、窗口类型等。本模块首批接口从API version 9开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口…

stm32学习总结:3、Proteus8+STM32CubeMX+MDK很有搞头

stm32学习总结&#xff1a;3、Proteus8STM32CubeMXMDK很有搞头 文章目录 stm32学习总结&#xff1a;3、Proteus8STM32CubeMXMDK很有搞头一、前言二、资料收集三、实际案例-点灯1、Proteus8安装2、Proteus创建stm32F013C6项目并添加外围LED电路3、STM32CubeMX配置F103C6引脚生成…

某信服 EDR 白程序DLL劫持

本文用到的白程序回复公众号20231211进行获取。 嗯… 记得去年HW的时候某信服给我装的EDR一直没卸载&#xff0c;不是不想卸载&#xff0c;是因为卸载要密码&#xff0c;所以就摆烂了。。。。 找到EDR这个目录&#xff0c;然后把目录复制到虚拟机中&#xff0c;然后一个一个e…

记录一下快速上手Springboot登录注册项目

本教程需要安装以下工具&#xff0c;如果不清楚怎么安装的可以看下我的这篇文章 链接: https://blog.csdn.net/qq_30627241/article/details/134804675 管理工具&#xff1a; maven IDE&#xff1a; IDEA 数据库&#xff1a; MySQL 测试工具&#xff1a; Postman 打开IDE…

【无线网络技术】——无线城域网(学习笔记)

&#x1f4d6; 前言&#xff1a;无线城域网&#xff08;WMAN&#xff09;是指在地域上覆盖城市及其郊区范围的分布节点之间传输信息的本地分配无线网络。能实现语音、数据、图像、多媒体、IP等多业务的接入服务。其覆盖范围的典型值为3~5km&#xff0c;点到点链路的覆盖可以高达…

大道至简?ETH研究团队提出简化版Transformer模型,综合效率明显提升

论文题目&#xff1a; Simplifying Transformer Blocks 论文链接&#xff1a;https://arxiv.org/abs/2311.01906 2023年&#xff0c;Transformer已经成为人工智能领域中最受欢迎的基础模型&#xff0c;如今火热的大型语言模型&#xff0c;多模态大模型均由不同类型的Transforme…

数据结构与算法-Rust 版读书笔记-2线性数据结构-队列

数据结构与算法-Rust 版读书笔记-2线性数据结构-队列 1、队列&#xff1a;先进先出 队列是项的有序集合&#xff0c;其中&#xff0c;添加新项的一端称为队尾&#xff0c;移除项的另一端称为队首。一个元素在从队尾进入队列后&#xff0c;就会一直向队首移动&#xff0c;直到…

财务机器人(RPA)会影响会计人员从业吗?

财务机器人会对会计从业人员有影响。 不过是正面积极的影响。 它是财务人员工作的好助手好帮手。 具体展开聊聊财务RPA机器人是如何成为财务人员的好帮手。 财务机器人是在人工智能和自动化技术的基础上建立的、以软件机器人作为虚拟劳动力、依据预先设定的程序与现有用户系…

Axure的安装以及简单使用

目录 Axure简介 是什么 有什么用 Axure的优缺点 优点&#xff1a; 缺点&#xff1a; 安装 汉化 Axure的使用 工具栏 页面 ​编辑 添加子页面 ​编辑 Axure简介 是什么 Axure是一款著名的原型设计工具。它允许用户创建交互式线框图、流程图、原型和其他设计文档&…

ERROR: [BD 41-237] Bus Interface property FREQ_HZ does not match between

在自定义IP出现以上错误时可以通过双击模块clk属性 如果是灰色无法二次编辑时&#xff0c;在封装IP时&#xff0c;选择以下菜单

【笔记】硬件工程师入门基础课程

学习视频&#xff08;b站&#xff09;&#xff1a;硬件工程师入门基础元器件课程 基础元器件课程 p1 电阻1. 定义、特性及参数1.1 色环电阻 识别方法&#xff1a;1.2 伏安特性1.3 基本参数 2.电阻的功能2.1 分压2.2 限流2.3 浪涌保护 3. 如何选择电阻 p2 电容1. 电容的定义1.1电…

redis(设置密码)配置文件详细

1.设置账号密码端口 config set requirepass 123456 设置密码为123456 config get requirepass 查看账号密码 auth 123456 登入的时候输入这个确定账号密码 1. 首先连接到Redis服务器: redis-cli 2. 然后使用CONFIG SET命令设置requirepass参数并指定密码: CONFIG SET requi…