Java语言实现简单的堆排序

手把手教 - VSCode 开发 GD32F450 单片机 系统版本:rt-thread v5.2.2单片机型号:GD32F450ZK基于文章进行开发。 阅读详情

Java语言实现简单的堆排序

直接切入正题。在这里实现一个一维数组的简单堆排序。
文字描述看的头痛,直接看图显得直观一些

摘自软件设计师教程
第一步:根据堆排序的定义,通过完全二叉树的方式去 实现,先定义一个Node类存放节点信息

class Node{
    Integer index;   //节点编号   节点编号的作用在第三步中会有体现
    Node parent;    //父节点
    Node left;      //左子节点
    Node right;     //右子节点
    Object data;    //数据
    public Node(){
        this.index = -1;
        this.parent = null;
        this.left = null;
        this.right = null;
        this.data = null;
    }
    public Node getParent() {
        return parent;
    }
    public Integer getIndex() {
        return index;
    }
    public void setIndex(Integer index) {
        this.index = index;
    }
    public void setParent(Node parent) {
        this.parent = parent;
    }
    public Node getLeft() {
        return left;
    }
    public void setLeft(Node left) {
        this.left = left;
    }
    public Node getRight() {
        return right;
    }
    public void setRight(Node right) {
        this.right = right;
    }
    public Object getData() {
        return data;
    }
    public void setData(Object data) {
        this.data = data;
    }
}

第二步,初始化二叉树,将数组中的元素放入Node中的data区保存,同时构建每个节点的双亲、左右孩子的关系

 //创建一棵树,为每个node节点添加双亲节点和子节点
    public static Node[] createTree(Object[] arr){
        Node[] tree = new Node[arr.length];
        for(int i = 0;i< tree.length;i++) {
            tree[i] = new Node();
            tree[i].setData(arr[i]);
            tree[i].setIndex(i);
            if (i != 0) {
                tree[i].setParent(tree[(i - 1) / 2]);
                if (tree[(i - 1) / 2].getLeft() == null) {
                    tree[(i - 1) / 2].setLeft(tree[i]);
                } else {
                    tree[(i - 1) / 2].setRight(tree[i]);
                }
            }
        }
        return tree;
    }

第三步:构造大根堆,调整每个节点的值,使得除叶子节点外的所有节点的data都不小于其左右子节点的data

 public static Node[] BigRootHeap(Node[] tree){
        int i = tree.length-1;
        while(i >=0){
            if(tree[i].getLeft() != null){
                if(tree[i].getRight() != null){
                    if(tree[i].getLeft().getData().hashCode() >=  tree[i].getRight().getData().hashCode()){
                        if(tree[i].getData().hashCode() < tree[i].getLeft().getData().hashCode()){
                            Object temp = tree[i].getData();
                            tree[i].setData(tree[i].getLeft().getData());
                            tree[i].getLeft().setData(temp);
                            /*当前节点和其左孩子交换data后可能会造成其左孩子的data小于它的左右孩子data,
                            因此,i需要跳转至其左左孩子节点的位置进行重新排序。下同*/
                            i = tree[i].getRight().getIndex();
                        }
                    }else{
                        if(tree[i].getData().hashCode() < tree[i].getRight().getData().hashCode()) {
                            Object temp = tree[i].getData();
                            tree[i].setData(tree[i].getRight().getData());
                            tree[i].getRight().setData(temp);
                            i = tree[i].getLeft().getIndex();
                        }
                    }

                }else{
                    if(tree[i].getData().hashCode() < tree[i].getLeft().getData().hashCode()){
                        Object temp = tree[i].getData();
                        tree[i].setData(tree[i].getLeft().getData());
                        tree[i].getLeft().setData(temp);
                        i = tree[i].getLeft().getIndex();
                    }
                }
            }else{

            }
            i--;
        }
        return tree;
    }

对二叉树进行调整,使得最大值放在最后一个节点,第二大值放在倒数第二个节点…以此类推

 public static void sortNode(Node[] tree){
        int i = tree.length-1;
        while(i > 0){
            Object temp = tree[i].getData();
            tree[i].setData(tree[0].getData());
            tree[0].setData(temp);
            /*将排好序的节点和它的双亲节点的父子关系置为null(双亲节点.setRight[Left](null)),
            如果不这么做,使用BigRootHeap(tree)再对树进行排序时依旧会把排好序的节点data计算在内,
            导致始终得不到一颗有序的树*/
            if(i % 2 == 0){
                tree[i].getParent().setRight(null);
            }else{
                tree[i].getParent().setLeft(null);
            }
            BigRootHeap(tree);
            i--;
        }
        //直接将排序内容输出
        for(int j= 0;j<tree.length;j++){
            System.out.print(tree[j].getData().toString()+" ");
        }
        System.out.println();
    }

运行结果

  public static void main(String[] args){
        Object[] arr = new Object[]{1,34,54,23,2,3433,12};
        sortNode(BigRootHeap(createTree(arr)));
    }

1 2 12 23 34 54 3433

新人第一次在csdn上写文章,有啥写的不对的地方或者需要改进烦请大家指出=-=

RT-DETR改进策略【损失函数篇】| 通过辅助边界框计算IoU提升检测效果(Inner_GIoU、Inner_DIoU、Inner_CIoU、Inner_EIoU、Inner_SIoU) 为了弥补现有 IoU 损失在不同检测任务中泛化性弱和收敛速度慢的问题,·Inner-IoU·通过引入比例因子 “ratio” 来控制辅助边界框的尺度大小,利用不同尺度的辅助边界框来计算损失,从而加速边界框回归过程。 阅读详情

相关推荐

ABtest描述统计功效

我们在面试数据分析时,常常会问到如何确定样本量的问题,会有一个指标:统计功效(power),或者是1-β 统计功效会影响实验的可信度,甚至会影响实验所需的样本量,要了解统计功效,首先要理解两类统计错误 假如我们做了一个AB实验,且两组用户的数据均值为μ1和μ2,我们会有两个初始假设: H0:两个实验组的数据没有差别(μ1=μ2),这个假设也叫“零假设”,也叫原假设 H1:两个实验组之间的数据存在差别(μ1≠μ2),这个假设也叫“非零假设”,也叫备择假设 定义两类错误: 实验本身没有效应,但我们觉

qq_38134556的博客 901

堆的Java实现

一.概念 堆是计算机科学中一类特殊的数据结构的统称,堆通常可以被看做是一棵完全二叉树的数组对象。 堆的特性: 1.它是完全二叉树,除了树的最后一层结点不需要是满的,其它的每一层从左到右都是满的,如果最后一层结点不是满的,那么要求左满右不满。保证叶结点只能出现在最下层or次下层 快速辨别: 看最后一层的最后一个结点G,G之前是满的就是完全二叉树。而红色的树 G之前未满,则是不完全二叉树 规律: ①如果一个结点的位置为k,则它的父结点的位置为k/2 , ②而它的两个子结点的位置则分别为2k和2k+1。 这样

机械工程跑路哥 1465

innovus实战攻略 | 用setUsefulSkewMode解锁时序优化的“隐藏技能”!

就像时序优化的“瑞士军刀”,参数虽多,但掌握了分类逻辑后,用起来其实很简单!如果你有更绝的用法,欢迎在评论区分享,大家一起卷起来!简单来说,它就是时序优化的“乾坤大挪移”。通过调整触发器的时钟到达时间,把关键路径的建立时间“借”给非关键路径,从而实现全局时序收敛。别急,这个命令就是你的“时序救星”!(工具最多只能借1.2ns的裕量,防止“借过头”导致新问题!这个参数能帮你兜底!(对关键路径“下死手”,确保优化到位!(设置上限,给工具套上“紧箍咒”!(直接跳过边界,避免优化反噬!(全局管理,防止“借过头”!

weixin_50820814的博客 1355

优先级队列(PriorityQueue)-JAVA

优先级队列以及用堆的模拟实现详解

tao的博客 1670

从零编写linux0.11 - 第二章 内核初始化

编程环境:Ubuntu Kylin 16.04 代码仓库:https://gitee.com/AprilSloan/linux0.11-project linux0.11源码下载(不能直接编译,需进行修改) 1.添加内核 进入内核后也不是马上进入main函数,上一章只是暂时设置gdt,此外还要设置idt和其他的一些初始化操作,这些内容也要使用汇编进行编写,此处采用AT&T格式的汇编。 以下为head.s的内容,为了简单起见,内容还是一个死循环。 .globl startup_32 startup_3

皓空Fly的博客 1265

把机器学习“搬进”数据库:SAP HANA PAL 快速上手与 ABAP AMDP 实战

摘要:本文探讨了SAP HANA PAL(Predictive Analysis Library)在企业数据分析中的实践应用。PAL通过将机器学习算法下推到数据库内部执行,有效解决了大数据量场景下的数据搬运瓶颈和治理成本问题。文章详细介绍了PAL的核心功能(包括聚类、分类、回归等10类算法)、使用前提(版本、组件和权限要求)以及通过AMDP实现ABAP与PAL集成的技术方案。重点阐述了参数表设计理念和两个典型应用场景:利用PageRank算法分析企业权限网络关系,以及通过PAL_SCALE进行特征预处理。文

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 5738

堆排序(Java实现)

堆排序的实现 堆排序的

weixin_58699220的博客 1186

23、电器元件符号及封装大全(2025版本)

总计28类电器元件符号和封装。

XU157303764的博客 2657

堆排序(java)

堆排序进行的介绍有图示和完整java代码

m0_57410337的博客 6151

Python 爬虫实战:豆瓣电影海报批量获取(Top250 榜单 + 可视化展示)

在信息爆炸的时代,数据已成为决策的核心,而数据的获取是数据分析的第一步。本文将详细介绍如何利用 Python 爬虫获取豆瓣电影 Top250 榜单的海报,并对数据进行可视化展示,助你更好地了解电影市场的趋势和用户的喜好。

yansideyucsdn的博客 718

Aurix TC3xx系列MCU ResourceM模块配置(多核资源分配)

为减轻主核的负载率或者平衡各个核的资源分配,通常需要把一些MCU内部资源分配到从核上,在EB tresos工具中,通过ResourceM模块实现多核资源分配。

m0_38045338的博客 1388

排序算法之堆排序--Java语言

堆排序算法首先将所有元素(从未排序的数组)插入堆中,然后从堆的根节点依次删除,直到堆空为止。本文主要利用现有数组进行就地排序,具体做法是,当删除一个元素时,只是将数组中的第一个元素与最后一个元素交换位置而不是移除,同时减小堆的大小,即数组大小,然后再对第一个元素进行堆化。持续这个过程直到剩余元素为1. 在数组中直接进行堆排序,需要知道几个参数,即最后一个元素的位置是i=count-1,count

carson0408的博客 1379

【YOLO11改进 - 注意力机制】SCSA通过结合空间注意力和通道注意力,提高各种下游视觉任务的性能。

【YOLO11改进 - 注意力机制】SCSA通过结合空间注意力和通道注意力,提高各种下游视觉任务的性能。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 475

数据结构与算法 7种排序算法的实现

1.冒泡排序 声明:本文章定义及代码搜集自 百度百科 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。 这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶...

BIG BOSS的博客 3948

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java程序员必须掌握的8大排序算法

本文主要详解了Java语言的8大排序的基本思想以及实例解读,详细请看下文8种排序之间的关系: 1, 直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。(2)实例(3)用java实现public class insertSort { pu

Mike_ToUp 479

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java的8大排序的基本思想及实例解读

Java的8大排序的基本思想及实例解读 本文主要详解了Java语言的8大排序的基本思想以及实例解读,详细请看下文: 8种排序之间的关系:   1, 直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排 好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数 也是排好顺序的。如此反复循环,直到全部排好顺序。 (2)实例

guobing965816的专栏 456

常用排序算法总结(三)

3.1 选择排序     ① 简单选择排序      简单选择排序的的实现比较容易。多次遍历序列,找出当前序列的最小的元素放在第一位即可。      时间复杂度为:O(n)。      排序稳定。 c语言: void SelectSort(int *array,int length,int index) { if(array==NULL||length=length-1)

24K丶小烦的博客 468

Java语言的8大排序

本文主要详解了Java语言的8大排序的基本思想以及实例解读,详细请看下文8种排序之间的关系:1,直接插入排序(1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。(2)实例(3)用java实现packagecom.njue; p...

weixin_34162629的博客 110

Java程序员必知的8大排序

本文主要详解了Java语言的8大排序的基本思想以及实例解读,详细请看下文 AD:2013云计算架构师峰会超低价抢票中 8种排序之间的关系: 1, 直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排 好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数 也是排好顺序的。如此反复循环,直到全部排好顺序。 ...

客人 123

排序算法的java实现

排序算法的java实现 直接插入排序 public static void insertSort(int arr[]){ int tmp, i, j; for (i = 1; i < arr.length; i++){ tmp = arr[i]; j = i - 1; while (j >= 0 && tmp < arr[j]){ arr[j+1] = arr[j];

weixin_39281866的博客 645

Java-8种排序算法

本文主要详解了Java语言的8大排序的基本思想以及实例解读,详细请看下文 8种排序之间的关系: 1, 直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排 好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数 也是排好顺序的。如此反复循环,直到全部排好顺序。 (2)实例 (3)用java实现

iJuly 's BLOG 235

java必学8大排序

本文主要详解了Java语言的8大排序的基本思想以及实例解读,详细请看下文 8种排序之间的关系: 1, 直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排 好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数 也是排好顺序的。如此反复循环,直到全部排好顺序。 (2)实例 (3)用java实现 package com.njue; publi

shijunwang的博客 327

(更新中)经典八大排序Python和java实现

插入排序 (1)直接插入排序 python实现 def InsertSort(list1): for i in range(1,len(list1)): temp = list1[i] j = i-1 while j>=0 and list1[j]>temp: list1[j+1] = list1[j] ...

落墨画雪的博客 206
下一篇: JavaWeb 文件上传和下载
钮祜禄氏·哆啦A栋
博客等级 码龄10年 0粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值