排序算法-堆排序

【排序算法】之堆排序 特别说明,这里的序列都是从1开始。 1、什么是堆 对于n个元素的序列{R1, … , Rn}当且仅当满足下列关系之一时,称之为堆: (1) Ri (2) Ri >= R2i+1 且 Ri >= R2i+2 (大根堆) 2、什么是堆排序 堆排序是一种树形选择排序,它的特点是在排序的过程中,将r[1..n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间 阅读详情

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

1. 基本思想

利用大顶堆(小顶堆)堆顶记录的是最大关键字(最小关键字)这一特性,使得每次从无序中选择最大记录(最小记录)变得简单。

① 将待排序的序列构造成一个最大堆,此时序列的最大值为根节点
② 依次将根节点与待排序序列的最后一个元素交换
③ 再维护从根节点到该元素的前一个节点为最大堆,如此往复,最终得到一个递增序列

2. 实现逻辑

① 先将初始的R[0…n-1]建立成最大堆,此时是无序堆,而堆顶是最大元素。
② 再将堆顶R[0]和无序区的最后一个记录R[n-1]交换,由此得到新的无序区R[0…n-2]和有序区R[n-1],且满足R[0…n-2].keys ≤ R[n-1].key
③ 由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1…n-1]调整为堆。然后再次将R[1…n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换,由此得到新的无序区R[1…n-2]和有序区R[n-1…n],且仍满足关系R[1…n-2].keys≤R[n-1…n].keys,同样要将R[1…n-2]调整为堆。
④ 直到无序区只有一个元素为止。

public int[] sortHeap(int[] array)  {

    int[] arr = Arrays.copyOf(array, array.length);
    int len = arr.length;
    buildMaxHeap(arr, len);

    for (int i = len - 1; i > 0; i--) {
        swap(arr, 0, i);
        len--;
        heapify(arr, 0, len);
    }
    return arr;
}

private void buildMaxHeap(int[] arr, int len) {
    for (int i = (int) Math.floor(len / 2); i >= 0; i--) {
        heapify(arr, i, len);
    }
}

private void heapify(int[] arr, int i, int len) {
    int left = 2 * i + 1;
    int right = 2 * i + 2;
    int largest = i;

    if (left < len && arr[left] > arr[largest]) {
        largest = left;
    }

    if (right < len && arr[right] > arr[largest]) {
        largest = right;
    }

    if (largest != i) {
        swap(arr, i, largest);
        heapify(arr, largest, len);
    }
}

private void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

文章参考:堆排序 | 菜鸟教程

漫谈经典排序算法:一、从简单选择排序到堆排序的深度解析 1、序言 这是《漫谈经典排序算法系列》第一篇,该篇从最简单的选择排序算法谈起,由浅入深的详细解析两种选择排序算法的过程及性能比较。逐步揭露选择排序的本质及其基本思想。 各种排序算法的解析请参考如下: 《漫谈经典排序算法:一、从简单选择排序到堆排序的深度解析》 《漫谈经典排序算法:二、各种插入排序解析及性能比较》 《漫谈经典排序算法:三、冒泡排序 && 快速排序》 《漫谈经典排序算 阅读详情

相关推荐

排序算法之 堆排序

堆排序 By yujian 选择排序算法,是选择最值,然后将其调整到合适位...

目前打算换一个工作,有招聘windows c++方向的也欢迎联系,北京、济南 最好 1万+

数据结构---堆排序

1、叶子完全二叉树:节点必须按从左到右存放,少也要从右边节点开始少,不能从中间突然少一个节点 满二叉树:也是完全二叉树的特例 大顶堆:父节点的值大于孩子节点 小顶堆:父节点的值小于孩子节点 叶子节点: 2、堆排序:默认从小到大排序,使用大顶堆 默认从大到小,使用小顶堆 (1)...

li94263的博客 3686

【堆排序】十大排序算法之堆排序

堆,是一种数据结构,它是一个完全二叉树的数据结构。什么是完全二叉树???要了解完全二叉树,就需要知道什么是二叉树???二叉树案例:满二叉树,所谓的满二叉树就是指:一颗具有【n】个结点的满二叉树,具有如下特点:满二叉树案例:完全二叉树,除了最后一层结点,其余每层结点都是满二叉树,并且最后一层结点是从左往右依次展示的。完全二叉树,首先它必须是一颗二叉树,然后这颗二叉树满足如下特点:完全二叉树,可以看作是除了最后一层之外,其余结点都是满二叉树的树。完全二叉树具有如下特点:完全二叉树案例:堆就是利用了完全二叉树..

✅ Java 开发工程师 1425

排序算法 - 堆排序

文章目录1. 什么是堆堆排序 1. 什么是堆 堆的本质上是一种完全二叉树,它分为两个类型 最大堆: 最大堆的任何一个父节点的值,都大于或等于它左、右孩子节点的值 最小堆: 最小堆的任何一个父节点的值,都小于或等于它左、右孩子节点的值 堆的根节点叫做 堆顶 最大堆和最小堆的特点决定了 最大堆的堆顶是整个堆中的最大元素,最小堆的堆顶就是整个堆中的最小元素 该数组从逻辑上讲就是一个堆结构,我们用简单的公式来描述一下堆的定义就是: 大顶堆:arr[i] >= arr[2i+1] &&a

浪人与酒 420

Easymesh之拓扑模块(二)

介绍 easymesh 拓扑消息:Topo discovery、Topo notification、Topo query、Topo response

qq_53619687的博客 2152

远程桌面(RDP)共享USB设备全攻略:不止Hyper-V,你的加密狗和CH340串口也能远程用

本文详细介绍了远程桌面(RDP)共享USB设备的完整解决方案,包括加密狗和CH340串口设备的远程使用技巧。通过RemoteFX USB重定向技术,用户可以在远程会话中无缝使用本地USB设备,提升工作效率。文章涵盖企业级配置、典型设备实战案例及高级故障排除方法,是远程工作者的实用指南。

weixin_42522964的博客 333

十大排序之堆排序

堆排序1.概念1.1. 堆的性质1.2. 堆的存储1.3. 堆的操作1.4. 排序思想2.算法步骤3.动图演示4.代码实现4.1. 最大堆排序4.1.1 算法实现4.1.2 测试程序4.2. 最小堆排序4.2.1 算法实现4.2.2 测试程序5.代码解释 1.概念 堆一般指的是二叉堆,顾名思义,二叉堆是完全二叉树或者近似完全二叉树。 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。 堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点

qq_46359697的博客 791

速腾R128雷达+海康全景相机ROS数据采集避坑实录:从‘雷达不转’到MATLAB标定的完整流程

本文详细记录了速腾R128激光雷达与海康威视全景相机在ROS环境下的数据采集与MATLAB标定全流程。从硬件配置的常见陷阱(如雷达旋转参数设置)、驱动编译的依赖管理,到多传感器同步的实战技巧和MATLAB标定方法,提供了完整的避坑指南和技术方案。特别针对RoboSense R128雷达和海康相机的特殊需求给出了具体解决方案。

weixin_28717807的博客 1218

堆排序算法

堆是一棵二叉树,有以下几个约束条件:(1)用数组表示(2)是一棵完全二叉树所谓完全二叉树就是用数组表示的时候,孩子节点的下标和父节点的下标满足如下的关系:下标从 0 开始。下图中,左边的二叉树是完全二叉树,右边的二叉树不是完全二叉树。(3)分大顶堆和小顶堆如果子节点的数值都不大于父节点,那么堆是大顶堆。如果子节点的数值都不小于父节点,那么堆是小顶堆。下图中,左边是大顶堆,右边是小顶堆。

weixin_38184628的博客 630

Transformer代码(Pytorch实现和详解)!!!

这个是第一版,有些代码如果不对,欢迎在评论指正,后续会慢慢改,我也是刚接触transformer,若有些地方理解不对还请指正。

xml的博客 5612

WPS Office 2026免费安装指南:AI办公与安全使用全解析

办公软件作为数字化办公的核心工具,其基本原理是通过文档处理、数据计算和演示展示等功能模块满足用户日常办公需求。随着人工智能技术的发展,现代办公软件逐步集成AI能力,通过自然语言处理和数据分析算法提升工作效率。在技术价值层面,优秀的办公软件不仅需要保持格式兼容性和跨平台同步能力,更要注重用户数据安全防护。从应用场景来看,无论是个人文档编辑、企业报表分析还是团队协作演示,办公软件都发挥着关键作用。WPS Office 2026作为国产办公软件代表,深度融合AI助手功能,支持智能写作和数据分析,同时通过官方免费策

weixin_30599769的博客 708

【数据结构】【啊哈算法】堆排序(小根堆,大根堆分别实现从小到大排序)

本文章主要目的是分享代码,不含堆知识的详细介绍 代码1 小根堆实现从小到到排序: 每次删除并输出(直接输出或存放于数组)顶部元素, 维护此时的小根堆,反复上行操作,直到堆为空为止 #include <bits/stdc++.h> using namespace std; int h[101],n; void siftdown(int i) { int t,flag=0; whil...

○( ^皿^)っHiahiahia…的博客 5893

python123题目——判断火车票座位B(异常)

类型:流程控制。

m0_62488776的博客 3569

排序算法上——插入,希尔,选择,堆排序

在希尔排序开始时增量较大,分组较多,每组的记录数目少,n小,此时直接插入最好和最坏时间复杂度n2差距很小,故各组内直接插入较快,后来增量di逐渐缩小,分组数逐渐减少,而各组的记录数目逐渐增多,但由于已经按di-1作为距离排过序,使文件较接近于有序状态,所以新的一趟排序过程也较快。2. 然而在排序的时候,时间消耗过于庞大,因为在挪动元素时,会把堆内的序列和关系打乱,因此应该建大堆,然后利用算法进行调整。1.希尔排序的核心在于对数组进行预排序,值得注意的是,预排序只是让数组相对有序,而非达到真正的有序状态。

2303_81060385的博客 1512

麒麟信安3.3-6C电网版虚拟机安装避坑指南:从ISO下载到SSH配置全流程

本文提供麒麟信安3.3-6C电网版虚拟机的详细安装与配置指南。针对电力行业仿真测试需求,重点解析从ISO镜像获取、虚拟机环境准备、安装过程中的三大“雷区”(如多管理员密码逻辑、分区方案、网络配置)到首次启动后的网络、SSH及root策略配置的全流程避坑要点,帮助技术人员高效、安全地完成部署。

rainy的博客 853

Plant Simulation 快速建模与布局(3)——自动生成的对象 代码“安全”删除管理

《PlantSimulation快速布局建模课程》教授利用SimTalk语言实现高效建模的技术要点,包括批量对象创建、阵列布局、属性管理及自动连接功能。重点讲解对象安全删除机制,通过existsObject检查对象存在性后使用deleteObject方法删除,避免程序报错。课程提供完整代码示例,展示如何通过循环结构实现矩阵布局对象的创建与安全删除,确保代码健壮性,显著提升建模效率。

qq_31964455的博客 116

排序算法——堆排序

排序算法——堆排序 堆排序是利用堆这种数据结构所设计的一种排序算法。堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。升序采用大顶堆,降序采用小顶堆。大顶堆:arr[i] > >= arr[2i+1] && arr[i] >= arr[2i+2];小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]。 例如一

程序员之道 1581

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【排序算法】选择排序、堆排序

堆排序是一种基于堆(Heap)数据结构的排序算法。最大堆:每个节点的值都大于或等于其子节点的值。根节点是最大值。最小堆:每个节点的值都小于或等于其子节点的值。根节点是最小值。首先将无序数组构建为一个最大堆。然后,将堆顶(即最大值)与数组的最后一个元素交换,缩小堆的范围,对剩下的元素继续调整成最大堆,直到排序完成。

2301_76677973的博客 2940

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

十大经典排序算法-堆排序算法详解

一、什么是堆排序 1.概念 堆排序(Heapsort)是利用二叉堆的概念来排序的选择排序算法,分为两种: 升序排序:利用最大堆进行排序 降序排序:利用最小堆进行排序 2.算法原理 给定一个最大堆如下图所示,以该最大堆进行演示堆排序 首先,删除堆顶元素10(即最大的元素),并将最后的元素3补充到堆顶,删除的元素10,放置于原来最后的元素3的位置 根据二叉堆的自我调整,第二大的元素9会成为二叉堆新的堆顶 删除元素9,元素8成为最大堆堆顶 删除元素8,元素7成为最大堆堆顶 依次删除最大元素,直至所有

qq_35344198的博客 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

排序算法 -堆排序

堆排序

shiyue 882

排序算法之堆排序

简介         堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。         堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即父节点结点的键值或索引总是小于(或者大于)它的子节点。 堆的概念         在介绍堆排序之前,简单介

qq_44290077的博客 3570
上一篇: 数据结构学习(Java)
下一篇: 矩阵中的路径
Array_new
博客等级 码龄5年 5粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Array_new

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值