堆排序 (heapSort)(Java实现)

HeapSort 堆排序 基于伪代码实现 阅读详情

1.推排序需要满足的条件

  • 完全二叉树 (除了最后一层结点都在最左边,其他层(1-h-1)结点都是最大个数,只能从左向右,从上到下添加结点)
  • 父结点的值大于子结点的值(大顶堆)
  • 父结点的值小于子结点的值(小顶堆)

2.怎么构建堆

1、每次找出子结点的最大值,和父结点做交换
2、从h-1往上进行heapify

3.怎么用代码表示堆

1、可以用一维数组表示堆,int[] arr = {}; 因为它是完全二叉树,并不会断开,假如根结点从0开始,
i=4,那么父结点就是(i-1)/ 2 向下取整,子节点就是2i+1和2i+2
在这里插入图片描述

4.流程

参考链接: 添加链接描述
1、首先用无序序列构造初始堆

  • 先从最后一个非叶子结点开始,也就是h-1层,从叶子结点中找到最大值和根结点进行交换,然后接着对h-2层进行同样的处理,直到最后1层,如果由于交换,此时子根不满足大顶堆的性质的话,那么就再次进行调整。

2、然后将堆顶元素和末尾元素进行交换,接着继续调整堆(这里是从根结点开始调整),继续将堆顶元素和末尾元素交换,直到最后序列有序。

5.代码

参考链接:添加链接描述

/**
 * @author: gethin
 * @create: 2018-05-23 16:21
 * @description: 常用排序算法
 **/
public class Sort {
    public static void main(String[] args) {
        int[] nums = {16,7,3,20,17,8};
        headSort(nums);
        for (int num : nums) {
            System.out.print(num + " ");
        }
    }

    /**
     * 堆排序
     */
    public static void headSort(int[] list) {
        //构造初始堆,从第一个非叶子节点开始调整,左右孩子节点中较大的交换到父节点中
        for (int i = (list.length) / 2 - 1; i >= 0; i--) {
            headAdjust(list, list.length, i);
        }
        //排序,将最大的节点放在堆尾,然后从根节点重新调整
        for (int i = list.length - 1; i >= 1; i--) {
            int temp = list[0];
            list[0] = list[i];
            list[i] = temp;
            headAdjust(list, i, 0);
        }
    }
    
    private static void headAdjust(int[] list, int len, int i) {
        int k = i, temp = list[i], index = 2 * k + 1;
        // < len是条件,index要有边界
        while (index < len) {
            if (index + 1 < len) {
                if (list[index] < list[index + 1]) {
                    index = index + 1;
                }
            }
            if (list[index] > temp) {
            // 这里是为了调整后面的子结点
                list[k] = list[index];
                k = index;
                index = 2 * k + 1;
            } else {
                break;
            }
        }
        // 最后确定这个值在哪里
        list[k] = temp;
    }
}

时间复杂度为O(nlogn)
Java实现堆排序(Heapsort)实例代码 主要介绍了Java实现堆排序(Heapsort)实例代码,有需要的朋友可以参考一下 立即下载

相关推荐

STM32踩坑--NoST-LINK detected

这里出现的NoST-LINK detected是没有扫描到端口 在我使用一段Fly-MCU后,有一天突然发现出现如上错误,再检查的过程中检查以下几点 1.STM32 魔术棒的设置 1.1Debug设置 1.2 utilities 设置没有问题,与原来一样又看了下端口——在设备管理器中;也没有问题 ...

qq_53002477的博客 2万+

堆排序(Heap Sort)-Java实现

堆排序(Heap Sort)算法简介: 堆排序是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序分为两种方法: 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列; 小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列; 堆排序(Heap Sort...

YUBANGSHUANGYUER的博客 563

RM机器人麦轮底盘实战:从零搭建到PID调参全记录(附避坑指南)

本文详细记录了RM机器人麦轮底盘从零搭建到PID调参的全过程,涵盖硬件组装、开发环境搭建、底盘解算和PID调参等关键步骤,并附有实用的避坑指南。特别针对麦轮控制、底盘解算和电机调试等核心问题提供了专业解决方案,帮助开发者快速提升机器人性能。

bush的博客 379

java语言堆排序(Heap Sort)详解

①、基本思想:堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 ②、算法描述: 将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区; 将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n]; 由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前

nandao158的博客 985

美团外卖 mtgsig 1.2 逆向工程与补环境实战指南

本文深入解析了美团外卖核心风控参数mtgsig 1.2的生成机制与逆向实战。通过拆解其复杂的JSON结构,揭示了设备指纹、环境信息加密等关键字段。重点阐述了在Node.js中模拟浏览器环境(补环境)的核心方法,包括DOM/BOM对象、本地存储及Canvas/WebGL等高级指纹的模拟技巧,为安全研究和合规自动化测试提供了一套完整的技术指南。

uber9的博客 410

BUPT软件安全实验三

可以看出栈溢出对程序运行的安全性有很大的威胁,如果不对栈进行保护,只要系统中存在栈溢出漏洞,即可令攻击者通过非正当方法获取操作权限。(6)解决思考题,即:在不修改StackOverrun程序源代码的情况下,构造shellcode,通过JMP ESP的方式实现通过记事本打开shellcode.txt(可使用CreateProcessA或WinExec等API)。查看缓冲区信息,可以看到dest指向地址0x0012FAF0,其为数组的存放起始位置,也就是shellcode注入的起始位置。

7xun's space 1967

Java算法之堆排序(Heap Sort)

堆排序是一种基于比较的排序算法,它使用二叉堆数据结构来实现。二叉堆是一种特殊的完全二叉树,其中每个父节点的键值都大于(或等于)其子节点的键值(大顶堆),或者小于(或等于)其子节点的键值(小顶堆)。堆排序通过维护堆的性质来高效地组织数据,从而实现排序。堆排序是一种高效的排序算法,尤其适合处理大数据集和实现优先队列。虽然它不是稳定的排序算法,但其原地排序的特性和对并行化的支持使其在许多应用场景下非常有价值。

weixin_38959316的博客 1038

高通平台Android稳定性调试笔记:手把手教你用T32、Crash Utility分析Kernel Panic与RAM Dump

本文详细介绍了高通平台Android内核崩溃的分析方法,包括使用T32 Simulator和Crash Utility工具链解析Kernel Panic与RAM Dump。从环境配置、dump文件预处理到高级调试技巧,手把手教你如何定位和解决Android系统崩溃问题,特别适用于MSM/SA8155平台的开发者。

weixin_42543046的博客 529

Java实现堆排序算法详解及优化

同时,我们探讨了堆排序的优化方法,包括使用更小的辅助空间,以提高其性能。堆排序通过将数组构建成一个最大堆,然后重复地将堆顶元素与末尾元素交换,并缩小堆的范围,重新调整堆结构来实现排序。交换堆顶和末尾元素: 1, 5, 3, 4, 10。交换堆顶和末尾元素: 1, 4, 3, 5, 10。交换堆顶和末尾元素: 1, 3, 4, 5, 10。构建最大堆: 10, 5, 3, 4, 1。调整堆: 5, 4, 3, 1, 10。调整堆: 4, 1, 3, 5, 10。调整堆: 3, 1, 4, 5, 10。

捕风捉你 · 星桥API接入与大模型实战 1451

华为OD机试真题 C 实现【水库蓄水问题】【2022.11 Q4 新题】

给定一个长度为 n 的整数数组height。数组的元素表示山的高度,选择两个元素作为水库的边界,求蓄水量的最大值并输出蓄水量最大时的边界下标(蓄水量相同时输出下标较近的)。

MISAYAONE的博客 1万+

读懂 SAP Fiori Administration Catalogs:从管理员入口、权限编排到 Spaces 和 Pages 的落地实践

SAP Fiori 管理员目录的核心价值在于为系统配置提供标准化入口,解决权限与展示分离的问题。随着 SAP_UI 7.55 版本更新,SAP_FLP_ADMIN 角色整合了关键管理工具(如 Launchpad Designer、Content Manager),并通过 Business Catalog 和 Space 的协同作用,确保管理员既能访问配置工具,又能直观查看相关功能入口。项目实施中需注意配置层级(系统级/客户端级)的选择,以及多人协作时的数据同步问题,以提升交付效率。

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

java 堆排序算法_Heapsort 堆排序算法详解(Java实现)

Heapsort (堆排序)是最经典的排序算法之一,在google或者百度中搜一下可以搜到很多非常详细的解析。同样好的排序算法还有quicksort(快速排序)和merge sort(归并排序),选择对这个算法进行分析主要是因为它用到了一个非常有意思的算法技巧:数据结构 - 堆。而且堆排其实是一个看起来复杂其实并不复杂的排序算法,个人认为heapsort在机器学习中也有重要作用。这里重新详解下关于...

weixin_36452379的博客 624

scottplot5中使用signalXY图,如何更新数据?

🏆本文收录于《优快云问答解答》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

**My Coding Family** 2446

堆排序(Heapsort)之Java实现

堆排序算法介绍 堆是一种重要的数据结构,为一棵完全二叉树, 底层如果用数组存储数据的话,假设某个元素为序号为i(Java数组从0开始,i为0到n-1), 如果它有左子树,那么左子树的位置是2i+1,如果有右子树,右子树的位置是2i+2,如果有父节点,父节点的位置是(n-1)/2取整。分为最大堆和最小堆,最大堆的任意子树根节点不小于任意子结点,最小堆的根节点不大于任意子结点。所谓堆排序就是利用堆这

永无止境,上下求索 6万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

HeapSort堆排序Java实现图文代码详解

堆排序(Heapsort)堆积树设计的一种排序算法,可以利用数组的特点快速定位指定索引的元素。 排序图如下:(gif来自维基百科) 堆排序的过程就是首先构建大根堆,然后对顶元素(及最大元素)与最后个元素替换位置,heapsize减一,重新调整堆变成大根堆。重复上面操作直到heapsize等于一的时候。排序完成。 最大堆的特性: 1.某个节点的值最多和其父节点的值一样大;

Alex-wang的专栏 2524

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

堆排序算法(HeapSort)

堆排序算法(HeapSort):堆的概念及常见操作、堆排序算法思想、性能分析、代码实现(Java)

Lyhdreamer的博客 1118

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

手写堆排序算法——HeapSort(Java代码实现)

HeapSort /** * @program: JavaTest * @description: 手写堆排序 * @author: yanghaoran * @create: 2019-05-27 20:35 **/ public class HeapSort { static int num = 0; public static void main(String[]...

- 918

算法:用Java实现堆排序(HeapSort)

本文我准备用Java实现堆排序。其实我以前在用二叉大顶堆实现优先队列的时候,就已经顺便实现了堆排序,今天把其中堆排序的代码提取出来,专门作为排序的一篇博文,并附上以前用二叉大顶堆实现的优先队列,以及顺便实现堆排序的博文地址:点我查看。具体的排序算法过程已经在注释里面了,大家可以复制代码到IDE里面,用DEBUG模式研究算法的过程: import java.util.ArrayList; impor...

weixin_39448458的博客 315

堆排序java代码实现

堆排序使用了“堆”数据结构来进行信息管理,因此,首先需要介绍一个数据结构“堆”。

u013230391的博客 322

heap java实现_堆排序heapSort java实现

堆排序中的堆我们指的是二叉堆,具有以下特点 1、是一个完全二叉树。 2、任一个结点值都比子结点大(大根堆),小(小根堆)。 堆排序具有的特点。 1、原地排序,所以其空间复杂度为lg(n)。 2、时间复杂度为nlg(n),而且最坏的情况下也是nlog(n)。 3、堆排序首先,堆分为两种:大根堆和小根堆。均可看成是一棵完全二叉树的顺序存储结构。对于大根堆,树中任一节点的值均不小于其孩子节点的值;同样,...

weixin_33602738的博客 210

[转载]堆排序(HeapSort) Java实现

堆排序的思想是利用数据结构--堆。具体的实现细节: 1. 构建一个最大堆。对于给定的包含有n个元素的数组A[n],构建一个最大堆(最大堆的特性是,某个节点的值最多和其父节点的值一样大。这样,堆中的最大元 素存放在根节点中;并且,在以某一个节点为根的子树中,各节点的值都不大于该子树根节点的值)。从最底下的子树开始,调整这个堆结构,使其满足最大堆的特 性。当为了满足最大堆特性时,堆结构发生变...

weixin_33806300的博客 580

Heapsort 堆排序算法详解(Java实现)

原文地址 http://www.cnblogs.com/jetpie/p/3971382.html (侵删) Heapsort (堆排序)是最经典的排序算法之一,在google或者百度中搜一下可以搜到很多非常详细的解析。同样好的排序算法还有quicksort(快速排序)和merge sort(归并排序),选择对这个算法进行分析主要是因为它用到了一个非常有意思的算法技巧:数据结

博客 636

堆排序(HeapSort)简单实现

堆排序(HeapSort) 堆性质: (二叉)堆是一个数组(不要把此处的堆与内存区域的堆内存混淆了)此处是指数据结构,二叉堆可以近似看成一个完全二叉树,将数组中元素从上自下,从左自右插入到完全二叉树中。堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值。 利用完全二叉树可以清晰地看出根节点与左右子孩子的关系:准确的说是看出根节点与左右还在在数组中下标的关系。 举个例子: 数组a: 转换为完全二叉树: 仔细观察数组位置于在完全二叉树中的位置会发现:假设父节点为i,左孩子:2i+1 右孩子

qq_43575784的博客 1495

JAVA:实现HeapSort堆排序算法(附带源码)

JAVA:实现HeapSort堆排序算法(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 730

HeapSort 堆排序 基于伪代码实现

此文原创,http://www.cnblogs.com/baokang/p/4735431.html,禁止转载 GIF 动态图 伪代码 /* From Wikipedia, the free encyclopedia*/ 1.父子节点特征 iParent = floor((i-1) / 2);iLeftChild = 2*i + 1;iRightChild =...

weixin_30278311的博客 211

面试-堆排序(heapSort)以及最大/小的k个数-java实现

Q: 同学面试腾讯的时候被问到:王者荣耀用户上亿,如何快速的从亿级数据量中找出排名榜首的几位玩家? A: 对于这种数据量比较大的情况,堆排序比较合适,而且堆排序每一轮可以找出当前数据中最大(大顶堆)或最小(小顶堆)的数,所以对于以上问题,用堆排序是不错的选择。 以找出输入数据中【最小的k个数】为例,java实现如下: package com.sap.stone; import java.util...

付石头的博客 805
上一篇: 顺序打印矩阵(Java实现)
下一篇: 进程的概念(了解一下)
念殊15
博客等级 码龄8年 17粉丝 177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值