堆排序Java

news2024/9/21 23:41:18

思路

这个代码还不错
https://blog.csdn.net/weixin_51609435/article/details/122982075

就是从下往上进行调整

1. 如何将数组映射成树

对于下面这颗树,原来的数组是:
在这里插入图片描述

在这里插入图片描述
好,如果调整的话,我们第一个应该调整的是最下边,最右边的树,即
在这里插入图片描述

5 2 1 根是 5 看看左右孩子有没有比他大的,我们在上边数组中如何确定第一个子树先找5 2 1 呢,
首先可以看一下下面的文章,介绍数组和树映射的
https://blog.csdn.net/qq_44993268/article/details/131452785

我们可以确定的是
这个小树的root 的index = 4 left = 9 right = 10

即 left = 2 * root +1
right = 2 * root +2;

我们现在知道的是数组的长度len,知道最后一个元素last = len-1(数组从0开始)
所以 如果我们设 第一个应该排序的子树即最下最右的子树的根为x

如果len是偶数,则最后一个在左边,即

len-1 = 2* x +1;
x=(len-2)/2

如果len是奇数,则最后一个在右边,即

len-1 = 2* x +2;
x=(len-3)/2

但是我们发现,就是不管奇数还是偶数,都可以用x=(len-2)/2这个来计算

这样我们就找到第一个需要调整的子树,下一个的话就是x-1(自己对着上边的树模拟)

bug

在这里插入图片描述
len-- 是下一行才起作用!

还有一个易错点,是 怎么判断三个数的大小,怎么找到三个数中最大的

代码

import java.util.Arrays;

public class HeapSortTest {
    public static void main(String[] args) {

        int[] arrary = {9,5 ,6,3,5,3,1,0,96,66};
        heapSort(arrary);
        System.out.println(Arrays.toString(arrary));
    }

    public static void heapSort(int[] nums){

        int len = nums.length;
        for (int i = (len-2)/2; i >=0 ; i--) {
            heapAdjust(i, nums, len);
        }
        while (len >1){
            int temp = nums[0];
            nums[0] = nums[len-1];
            nums[len-1] = temp; //最后一个
            heapAdjust(0, nums,--len);
            System.out.println(Arrays.toString(nums));
        }
    }

    // start 需要调整的子树的根
    // len 是目前需要调整的数组的长度
    private static void heapAdjust(int start, int[] nums, int len) {
        for (int i = start; i < len;) {
            //左孩子右孩子都有
            if (i*2+1 < len && i*2+2 < len){
                if (nums[i] >= nums[i*2+1] && nums[i] >= nums[i*2+2]){
                    return;
                } else if (nums[i] >= nums[i*2+1] && nums[i] < nums[i*2+2]) {
                    //右孩子大
                    int temp = nums[i*2+2];
                    nums[i*2+2] = nums[i];
                    nums[i] = temp;
                    i = i*2+2;
                } else if (nums[i*2+2] < nums[i*2+1]){
                    int temp = nums[i*2+1];
                    nums[i*2+1] = nums[i];
                    nums[i] = temp;
                    i = i*2+1;
                }else {
                    int temp = nums[i*2+2];
                    nums[i*2+2] = nums[i];
                    nums[i] = temp;
                    i = i*2+2;
                }
            } else if (i*2+1 < len) { //只有左孩子
                if (nums[i] >= nums[i*2+1]){
                    return;
                }else {
                    int temp = nums[i*2+1];
                    nums[i*2+1] = nums[i];
                    nums[i] = temp;
                    i = i*2+1;
                }

            }else { //左右孩子都没有
                return;
            }

        }
    }

}

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

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

相关文章

JVM面试真题总结(三)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 解释-下Full GC? Full GC&#xff0c;也被称为Major GC&#xff…

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操…

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节&#xff0c;字符串小于等于15直接保存在栈上&#xff0c;超过之后才会使用new分配。

网络学习-eNSP配置多交换机VLAN

实验环境 通过华为eNSP软件实现 1.两台S3700交换机 2.四台电脑PC1&#xff1a;192.168.0.1PC2&#xff1a;192.168.0.2PC3&#xff1a;192.168.0.3PC4&#xff1a;192.168.0.4PC11&#xff1a;192.168.0.11PC22&#xff1a;192.168.0.22PC33&#xff1a;192.168.0.33PC44&…

SpringBoot开启多端口探究--基于多ApplicationContext

文章目录 前情提要一、思路概要二、具体实现三、其他问题父子关系部分依赖 总结 前情提要 前面探讨了management端口开启&#xff0c;grpc端口开启&#xff0c;本文继续探讨在SpringApplication中开启多个端口的方式之多ApplicationContext, 相比management端口基于多WebServe…

AI绘画工具排行榜:探索最受欢迎的AI绘图软件特点与选择指南

AI绘画工具各有优势&#xff0c;从开放性到对特定语言和文化的支持&#xff0c;以及对图像细节和艺术性的不同关注点&#xff0c;根据具体需求选择合适的工具 MidJourney 图片品质卓越&#xff0c;充满独特创意&#xff0c;初期能够免费获取数十账高质量图片&#xff0c;整个生…

uuid.js 使用

相关代码 import { NIL } from "uuid";/** 验证UUID* 为空 则返回 false* param uuid* returns {boolean}*/ export function MyUUIDValidate(uuid: any): boolean {if (typeof uuid "string" && uuid ! NIL) { //uuid ! NIL 判断是否是默认值00…

C++笔记---vector

1. vector的介绍 vector其实就是我们所熟知的顺序表&#xff0c;但其是作为STL中的一个类模板而存在。 也就是说&#xff0c;vector是可以用来存储任意类型数据的顺序表&#xff0c;既可以是内置类型&#xff0c;也可以是自定义类型&#xff0c;或是STL中的其他容器。 vecto…

学习算法的类型

学习算法的类型 一、说明 嘿&#xff0c;好奇的伙伴们&#xff01;今天&#xff0c;让我们踏上一段激动人心的机器学习算法领域之旅。&#x1f680; 如果你和我一样&#xff0c;你可能会发现机器学习的世界非常迷人&#xff0c;有时甚至有点让人不知所措。但不要害怕&#xf…

Qt Widget核心属性

文章目录 前言enabledgeometrywindowTitlewindowIconwindowOpacitycursorfonttoolTipfocusPolicystyleSheet 前言 Qt中的各种控件&#xff0c;都是继承自QWidget类&#xff0c;了解这个类的属性方法之后&#xff0c;后续的控件也通用 enabled enabled描述了一个控件是否处于…

未来工作趋势:零工小程序在共享经济中的作用

经济在不断发展的同时&#xff0c;科技也在飞速发展。零工经济作为一种新兴的工作模式&#xff0c;正在全球范围内迅速崛起。特别是在中国&#xff0c;随着数字经济的蓬勃发展和共享经济模式的深入推广&#xff0c;零工小程序在促进就业、提升资源利用效率方面显示出了巨大的潜…

2024年AMC10美国数学竞赛倒计时两个月:吃透1250道真题和知识点(持续)

根据通知&#xff0c;2024年AMC10美国数学竞赛的报名还有两周&#xff0c;正式比赛还有两个月就要开始了。计划参赛的孩子们要记好时间&#xff0c;认真备考&#xff0c;最后冲刺再提高成绩。 那么如何备考2024年AMC10美国数学竞赛呢&#xff1f;做真题&#xff0c;吃透真题和…

FreeRTOS学习笔记—②RTOS的认识及任务管理篇

由于正在学习韦东山老师的RTOS课程&#xff0c;结合了网上的一些资料&#xff0c;整理记录了下自己的感悟&#xff0c;用于以后自己的回顾。如有不对的地方请各位大佬纠正。 文章目录 一、RTOS的优势二、RTOS的核心功能2.1 任务管理2.1.1 任务的创建2.1.2 任务的删除*2.1.3 任…

Windows系统安装node.js环境并创建本地服务使用内网穿透发布至公网

目录 前言 1.安装Node.js环境 2.创建node.js服务 3. 访问node.js 服务 4.内网穿透 4.1 安装配置cpolar内网穿透 4.2 创建隧道映射本地端口 5.固定公网地址 前言 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊Windows系统安装node.js环…

Arch - 架构安全性_认证(Authentication)的标准和实现

文章目录 OverView认证的标准认证的基础认证的范围认证的标准与实践HTTP认证框架Web认证&#xff08;表单认证&#xff09;WebAuthn标准认证流程示例&#xff1a;WebAuthn 小结 认证的实现JAASSpring Security 和 Shiro小结 OverView 即使只限定在“软件架构设计”这个语境下&…

MonoHuman: Animatable Human Neural Field from Monocular Video 精读

一、共享双向变形模块 1. 模块的核心思想 共享双向变形模块的核心目标是解决从单目视频中生成不同姿态下的3D人体形状问题。因为视频中的人物可能处于各种动态姿态下&#xff0c;模型需要能够将这些不同姿态的几何形状进行变形处理&#xff0c;以适应标准的姿态表示并生成新的…

# VMware 共享文件

VMware tools快速安装 VMware 提供了 open-vm-tools&#xff0c;这是 VMware 官方推荐的开源工具包&#xff0c;通常不需要手动安装 VMware Tools&#xff0c;因为大多数 Linux 发行版&#xff08;包括 Ubuntu、CentOS 等&#xff09;都包含了 open-vm-tools&#xff0c;并且已…

FreeRTOS内部机制学习02(消息队列深度学习)

文章目录 队列的核心以及好处队列的核心队列的好处 深入源码了解队列机制深入队列读取操作深入队列写入操作读写队列出超时时间 信号量深入信号量获取以及释放操作 互斥量互斥量和信号量的不同深入源码看优先级继承是怎么操作到的 队列的核心以及好处 队列的核心 队列的核心就…

如何打造高效办公楼物业管理系统?Java SpringBoot+Vue架构详解,实现智能化管理,提升工作效率

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

GraphPad Prism 10 for Mac/Win:高效统计分析与精美绘图的科学利器

GraphPad Prism 10 是一款专为科研工作者设计的强大统计分析与绘图软件&#xff0c;无论是Mac还是Windows用户&#xff0c;都能享受到其带来的便捷与高效。该软件广泛应用于生物医学研究、实验设计和数据分析领域&#xff0c;以其直观的操作界面、丰富的统计方法和多样化的图表…