堆排序详细解读

 

简介

堆排序是一种基于二叉堆数据结构的排序算法,它的特点是不同于传统的比较排序算法,它是通过建立一个堆结构来实现的。堆排序分为两个阶段,首先建立堆,然后逐步将堆顶元素与堆的最后一个元素交换并调整堆,使得最大(或最小)元素逐步沉到堆的末尾,完成排序。

堆的概念

  • 堆是一种特殊的树状数据结构,其中每个节点的值大于等于(或小于等于)其子节点的值。是一个平衡二叉树。
  • 最大堆:每个节点的值都大于或等于其子节点的值。
  • 195fc9a703b24b02a65741cc5f2770c3.png
  • 最小堆:每个节点的值都小于或等于其子节点的值。

堆排序步骤

  1. 构建堆: 将待排序的数组构建成一个二叉堆。

    • 最大堆构建: 从数组的中间位置开始,从右至左,从下至上进行堆调整。
    • 最小堆构建: 从数组的中间位置开始,从右至左,从下至上进行堆调整。
  2. 堆排序: 通过反复将堆的根节点(最大或最小值)与堆的最后一个元素交换,并重新调整堆,实现排序。

    • 最大堆排序: 将堆顶元素与堆的最后一个元素交换,然后将堆的大小减1,并重新调整堆。
    • 最小堆排序: 类似于最大堆排序,但是每次选择堆中的最小元素。

堆排序的代码示例(最大堆排序)

public class HeapSort {
    public static void main(String[] args) {
        int[] arr = {3, 8, 2, 5, 1, 4, 7, 6};
        heapSort(arr);
        for (int i : arr) {
            System.out.print(i + " ");
        }
    }

    public static void heapSort(int[] arr) {

        for (int i = (arr.length -1)/ 2 ; i >= 0; i--) {
            adjustHeap(arr, i, arr.length);
        }
        int temp;
        for (int j = arr.length - 1; j > 0; j--) {
            temp = arr[j];
            arr[j] = arr[0];
            arr[0] = temp;
            adjustHeap(arr, 0, j);
        }
    }

    public static void adjustHeap(int[] arr, int i, int length) {
        int 父节点 = arr[i];
        for (int k = i * 2 + 1; k < length; k = k * 2 + 1) {
            if (k + 1 < length && arr[k] < arr[k + 1]) {
                k++;
            }
            //k左右孩子较大的一个
            if (arr[k] > 父节点) {
                arr[i] = arr[k];
                i = k;
            } else {
                break;
            }
        }
        arr[i] = 父节点;
    }
    
    
}

 

 详细讲解

这段代码实现了堆排序(Heap Sort)算法。我将为你逐段解释代码的功能。

  1. 初始化数组:

int[] arr = {3, 8, 2, 5, 1, 4, 7, 6};

这行代码定义了一个整数数组 arr,并初始化了8个数值。
2. 调用堆排序方法

heapSort(arr);

 这行代码调用了 heapSort 方法,并将数组 arr 作为参数传递。
3. 打印排序后的数组:

for (int i : arr) {  
    System.out.print(i + " ");  
}

这段代码遍历数组 arr 并打印每个元素。此时,数组应该已经被排序,所以输出的应该是排序后的数组:1 2 3 4 5 6 7 8 。
4. 堆排序方法:
堆排序方法分为两个主要部分:建立最大堆和交换堆顶元素与最后一个元素,然后调整堆。 

* **建立最大堆**:  
```  
java`for (int i = (arr.length -1)/ 2 ; i >= 0; i--) {  
    adjustHeap(arr, i, arr.length);  
}`  
```  
这段循环遍历数组的索引,从 `(arr.length -1)/ 2` 到 0,并对每个索引调用 `adjustHeap` 方法来调整堆。  
* **交换和调整堆**:  
```  
java`for (int j = arr.length - 1; j > 0; j--) {  
    temp = arr[j];  
    arr[j] = arr[0];  
    arr[0] = temp;  
    adjustHeap(arr, 0, j);  
}`  
```  
这段循环每次从数组的末尾开始,将堆顶元素(最大值)与最后一个元素交换,然后重新调整堆。这样,最大的元素会逐渐移到数组的末尾。

5. 调整堆方法:
这个方法负责调整堆以满足最大堆的特性。如果父节点的值小于其子节点的值,那么就需要交换它们。这个方法会一直递归地检查和调整,直到满足最大堆的条件为止。

6.主类HeapSort:这是整个程序的容器,它包含 main 方法和其他辅助方法。

好的,我继续为您解释这段代码。

7.adjustHeap方法详解:

public static void adjustHeap(int[] arr, int i, int length) {  
    int 父节点 = arr[i]; // 获取当前节点的值,并将其称为父节点  
    for (int k = i * 2 + 1; k < length; k = k * 2 + 1) { // 循环遍历左孩子节点,右孩子节点  
        if (k + 1 < length && arr[k] < arr[k + 1]) { // 如果右孩子的值大于左孩子的值  
            k++; // 则将k移动到右孩子的位置  
        }  
        //k左右孩子较大的一个  
        if (arr[k] > 父节点) { // 如果当前节点大于父节点  
            arr[i] = arr[k]; // 用当前节点的值替换父节点的值  
            i = k; // 将i设置为当前节点的索引  
        } else {  
            break; // 如果当前节点不大于父节点,则跳出循环  
        }  
    }  
    arr[i] = 父节点; // 将父节点的值设置回父节点位置  
}

这段代码的主要目的是确保堆的属性在调用该方法后得到满足。它从给定的索引 i 开始,并确保该索引下的子节点是最大的。如果子节点的值小于父节点,则交换它们。这个过程会继续,直到满足堆的属性为止。

总结:这段代码实现了一个堆排序算法。它首先构建一个最大堆,然后通过交换堆顶元素与最后一个元素来排序数组。每次交换后,它都会重新调整堆以确保其属性得到满足。

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

知虾数据工具:助力Shopee商家实现数据化运营的有力助手

在如今竞争激烈的电商市场中&#xff0c;了解市场趋势、优化产品和店铺运营、了解竞争对手等是商家取得成功的关键。而针对Shopee平台的知虾数据工具则为商家和市场分析师提供了一个强大的数据分析工具。本文将介绍知虾数据工具的主要功能&#xff0c;包括多站点数据分析、行业…

智能优化算法应用:基于算术优化算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于算术优化算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于算术优化算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.算术优化算法4.实验参数设定5.算法结果6.参考…

Pytest 使用及调用方法

使用python -m pytest调用pytest 2.0版本新增 你可以在命令行中通过Python编译器来调用Pytest执行测试: python -m pytest [...] 通过python调用会将当前目录也添加到sys.path中,除此之外,这几乎等同于命令行直接调用pytest [...]。 可能出现的执行退出code 执行pytest可能…

Python (十八) 正则表达式

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一份大厂面试资料《史上最全大厂面试题》&#xff0c;Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

vue中的this.$nextTick().then()

MENU 示例一示例二sortsplicepushrandomfloorMathwhile演示 示例一 let reorganize function (arr){let rest [];while (arr.length > 0) {let random Math.floor(Math.random() * arr.length);// 把获取到的值放到新定义的数组中rest.push(arr[random]);// 这句代码的作…

通过证书透明度发现更多相关资产

通过证书透明度发现更多相关资产 1.证书透明度概述2.搜索实战3.为什么证书透明度技术是可行的4.DigiCert 和其他 CA5.缺陷缓解措施 1.证书透明度概述 许多现代网站都采用自动颁发和续订 TLS 证书&#xff0c;在设置 TLS 证书部署的方式上存在缺陷。它允许任何人发现同一服务器…

面试必会-JAVA基础篇-01

文章目录 1. Final 有什么用&#xff1f;2. 什么是重载&#xff08;Overload&#xff09;和重写&#xff08;Override&#xff09; ?3. 重载的方法能否根据返回类型进行区分&#xff1f;4. 和 equals 的区别是什么5. 什么是反射机制&#xff1f;6. 反射机制优缺点7. 在你进行…

免费百度SEO优化工具,百度SEO优化排名工具

百度SEO关键词工具 让我们聚焦在百度SEO关键词工具上。对于任何想要在百度搜索引擎中脱颖而出的网站管理员而言&#xff0c;深入了解用户搜索习惯和关键词的选择是至关重要的。 百度SEO关键词工具不仅提供了免费的服务&#xff0c;而且功能强大。通过输入相关领域的关键词&…

STM32串口接收不定长数据(空闲中断+DMA)

玩转 STM32 单片机&#xff0c;肯定离不开串口。串口使用一个称为串行通信协议的协议来管理数据传输&#xff0c;该协议在数据传输期间控制数据流&#xff0c;包括数据位数、波特率、校验位和停止位等。由于串口简单易用&#xff0c;在各种产品交互中都有广泛应用。 但在使用串…

佛罗里达大学利用神经网络,解密 GPCR-G 蛋白偶联选择性

内容一览&#xff1a;G 蛋白偶联受体 (GPCRs) 是一种将细胞膜外的刺激&#xff0c;传递到细胞膜内的跨膜蛋白&#xff0c;广泛参与到人体生理活动当中。近日&#xff0c;佛罗里达大学的研究者测定了 GPCRs 和 G 蛋白的结合选择性&#xff0c;并开发了预测二者选择性的算法&…

C++日常遇到的一些坑的总结

一、const 相关 C中const的不同位置的用法 const 修饰符用法总结 二、函数形参没有变量名 三、指针偏移问题 笔记&#xff1a; 包含来自C标准库的头文件&#xff0c;用#inlcude<xxx>&#xff0c;包含不来自C标准库的头文件&#xff0c;用#include"xxx"最…

【动手学深度学习】(十)PyTorch 神经网络基础

文章目录 一、层和块1.自定义块2.顺序块3.在前向传播函数中执行代码 二、参数管理1.参数访问2.参数初始化3.参数绑定 三、自定义层1.不带参数的层2.带参数的层 四、读写文件1.加载和保存张量2.加载和保存模型参数 [相关总结]state_dict() 一、层和块 为了实现复杂神经网络块&am…

论文投稿查询会议期刊及deadlines的网站

1. 这个是查近期CCF-ABC的ddl会议的网址 https://ccfddl.github.io/ https://ccfddl.top/ 2. 期刊选刊 https://ijournal.topeditsci.com/home https://journalsuggester.springer.com/ 3. IEEE出版物推荐 https://publication-recommender.ieee.org/home

java后端技术演变杂谈(未完结)

1.0版本javaWeb&#xff1a;原始servletjspjsbc 早期的jsp&#xff1a;htmljava&#xff0c;页面先在后端被解析&#xff0c;里面的java代码动态渲染完成后&#xff0c;成为纯html&#xff0c;再通过服务器发送给浏览器显示。 缺点&#xff1a; 服务器压力很大&#xff0c;因为…

【C语言】深入理解C语言中的数学运算和类型转换

文章目录 引言取负运算的奥秘源码探索分析与解读 浮点数运算的精细差异源码分析 精度损失与隐式类型转换精度和除零运算探究float类型和double类型的精度各是多少&#xff08;即十进制有效位的位数&#xff09;&#xff1f;在你的机器上&#xff0c;“负数开方”是如何处理的&a…

用友U8 Cloud TaskTreeQuery SQL注入漏洞复现

0x01 产品简介 用友U8 Cloud是用友推出的新一代云ERP&#xff0c;主要聚焦成长型、创新型企业&#xff0c;提供企业级云ERP整体解决方案。 0x02 漏洞概述 用友U8 Cloud /service/~iufo/nc.itf.iufo.mobilereport.task.TaskTreeQuery接口处存在SQL注入漏洞&#xff0c;未授权的…

类和对象——(6)友元

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 没有存储汗水&#xff0c;就无法支取成…

奥本海默-电影剧情简介

片头&#xff0c;奥本海默 脑海浮现恒星生命周期画面 1925年&#xff0c;奥本海默离开美国去欧洲学习新物理&#xff08;量子力学&#xff09; 脑海浮现量子力学相关画面&#xff08;像 德布罗意波&#xff09; 1927年从德国哥廷根大学毕业&#xff0c;获得物理学博士学位。…

MySQL笔记-第04章_运算符

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第04章_运算符1. 算术运算符2. 比较运算符3. 逻辑运算符4. 位运算符5. 运算符的优先级拓展&#xff1a;使用正则表达式查询 第04章_运算符 …

计算机辅助药物设计AIDD-小分子-蛋白质|分子生成|蛋白质配体相互作用预测

文章目录 计算机辅助药物设计AIDD【小分子专题】AIDD概述及药物综合数据库学习机器学习辅助药物设计图神经网络辅助药物设计自然语言处理辅助药物设计药物设计与分子生成 计算机辅助药物设计【蛋白质专题】蛋白质数据结构激酶-Kinase相似性学习基于序列的蛋白质属性预测基于结构…