算法学习笔记(5)-堆排序

【算法】堆排序 基础排序算法之一:堆排序。 阅读详情
public class HeapSort {

    public static void heapSort(int[] a) {
        int n = a.length - 1;
        //构造一个大顶堆,时间复杂度O(n)
        for (int k = n / 2; k >= 0; k--) {
            //从最后一个非叶子节点开始往上进行节点下沉,构造大顶堆
            sink(a, k, n);
        }

        //进行真正的堆排序,时间复杂度O(n) * O(logn) = O(nlogn)
        while (n > 0) {
            //取出根节点(最大值)和最后一个节点交换并且对这个节点进行调整,使堆平衡
            swap(a, 0, n--);
            //调整
            sink(a, 0, n);
        }
    }


    /**
     * @auther: Arong
     * @description: 将a构造成k到n的大顶堆
     * @param: [a, k, n]
     * @return: void
     * @date: 19-5-15 下午11:38
     */
    public static void sink(int[] a, int k, int n) {
        // 以0为开始索引
        while (2 * k + 1 <= n) {
            int j = 2 * k + 1;
            //当右节点大于左节点时,让j指向右节点
            if (j < n && a[j] < a[j + 1]) {
                j++;
            }
            //当a[k]大于等于a[j]时,说明位置正确,无需调整
            if (a[k] >= a[j]) {
                break;
            }
            //a[k]小于a[j],交换位置以调整
            swap(a, k, j);
            //重新定位节点
            k = j;
        }
    }
    private static void swap(int[] a, int i, int j) {
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }



    @Test
    public void fun() {
        int[] array = {6, 2, 1, 6, 9, 3, 5, 0, -1, -4};
        heapSort(array);
        System.out.println(Arrays.toString(array));
    }
}
【python算法系列四】堆排序算法 堆排序,就像它的名字一样,利用了堆的特性来进行排序。实现堆排序的思路是,把数组构建成一棵二叉树,并随着每次堆的变化更新堆顶的最大/最小值。堆排序的时间复杂度在所有情况下都是 O(nlgn),它也是一个不稳定的算法。在开始编写堆排序的程序之前,我们首先要了解“堆”的概念。 堆是一种数据结构,它是一种特殊的完全二叉树:如果这个堆是一个大顶堆(最大的元素在堆顶),那么每个节点上的元素都应该比它的子节点上的元素要大,最大的元素在根节点上;反之,如果是小顶堆,那么每个节点上的元素都应该比它的子节点小,最小的元素在根节 阅读详情

相关推荐

排序算法总结——堆排序

1.算法原理及步骤 2.实现代码 3.时间复杂度分析 3.1 构建初始大顶堆时间复杂度 3.2 堆调整时间复杂度 补充说明 4. 稳定性分析 1.算法原理及步骤 要搞清楚堆排序,首先就需要明白什么是堆,在堆排序中,堆是一种类似于完全二叉树的结构,那么完全二叉树是什么呢?简单来讲,完全二叉树就是指叶子结点只存在于最后两层的树。而堆排序则是利用这一数据结构进行排序,排序...

HerofH_的博客 1910

排序算法(6)堆排序

堆排序是对简单选择排序的一种改进。堆排序有大顶堆(根结点最大)和小顶堆(根结点最小)之分。 基于大顶堆的完全二叉树,其核心思想为: 1)将原始序列构成一个堆。(建立初始堆) 2)交换堆的第一个元素和堆的最后一个元素的位置; 3)将移走(交换)最大值元素之后的剩余元素所构成的序列再转换为一个堆。 4)重复上述过程(2)、(3)步n-1次 问题:(1)、如何将原始序列构成一

王小东大将军的博客 452

算法设计与分析——堆排序

算法设计与分析、堆排序、JavaScript算法、C语言算法、排序算法、高效算法

A_FLY_User的博客 1565

6-3 堆排序

本题要求实现堆排序中的筛选函数,待排序列的长度1

Moliay的博客 900

java算法——希尔排序

按下标的一定增量分组,对每组使用直接插入算法排序;随着增量 * 逐渐减少,每组包含的关键字越来越多,当增量减至1时,整个文件恰 * 好被分成一组,算法便终止。 * 8,9,1,7,2,3,5,4,6,0 * //初始增量 gap=length/2=5,向下取整, 分为5组,下标[i]和[i+5]进行比较 * 3,5,1,6,0,8,9,4,7,2 * //缩小增量 gap=5/2=2,分为2组,下标[i],[i+2],[i+4],[i+6],[i+8] * 0,2,1,4,3,5,7,6,9,8 * //在缩小增量gap=2/2=1,分为1组 * 0,1,2,3,4,5,6,7,8,9

解锁Cherry Studio高阶玩法:用MCP实现自动化测试与数据爬取

本文深入探讨了如何利用MCP协议与Cherry Studio结合,实现自动化测试与数据爬取的高阶应用。通过Playwright等工具的MCP集成方案,详细解析了自动化测试流水线构建和智能爬虫系统开发的关键技术,显著提升工程效率和系统适应性。

defi6farmer的博客 275

PTA 6-2 堆排序 (10分)

本题要求实现堆排序中的筛选函数,待排序列的长度1<=n<=1000。 函数接口定义: void HeapAdjust( HeapType H, int s, int m); 其中L是待排序表,使排序后的数据从小到大排列。 类型定义: typedef int KeyType; typedef struct { KeyType *elem; /*elem[0]一般作哨兵或缓冲区*/ int L

Captain0827的博客 1万+

【现代电路理论】【2】考尔法设计无源单口网络

夏 弥:其实你在冰面上看到鱼浮上来 明年冬天如果你还在那里,那鱼还是会上来换气 那时候你就可以带一把冰镐 把冰面砸开把鱼捞上来熬汤

痛苦的时候装出幸福相,这不是那么难做到的事 2887

2024.11.23 周赛题解

本道题最重要的就是记录下皇后占领的格子(打标记的思想),通过此判断下一个皇后是否可以在某个位置,如果可以,则继续搜索下一个皇后可以在的位置,如果不行,则清除标记回到上一步,继续搜索;我们只要枚举白与蓝、蓝与红的边界(如上图a和b),再统计三个区域里总共有多少格子需要涂改颜色,用一个变量来记录最优的答案(即需要涂改的格子数最少),不断更新,最后输出就OK了。我们把奇数位置看成鸽巢,把字符看成鸽子,其实就是往鸽巢里塞鸽子(塞满奇数位置剩下的依次放入偶数位置即可),这就是一个鸽巢原理。而又是乌龟先开始(排序。

m0_61142471的博客 2022

特斯拉Model 3 BMS主控板拆解:从硬件设计到热管理策略的实战解析

本文深度拆解特斯拉Model 3的BMS主控板,解析其硬件架构与热管理协同策略。文章聚焦于主控板的分区布局、双核MCU的智慧分工,以及从被动监控到主动干预的热管理范式转变,揭示了特斯拉在高压安全、实时控制与系统级工程思维上的设计哲学。

zz67890的博客 595

logisim实验六:MIPS运算器设计

实验目的 学生理解算术逻辑运算单元(ALU)的基本构成,掌握 Logisim 中各种运算组件的使用方法,熟悉多路选择器的使用,能利用前述实验完成的 32 位加法器、 Logisim 中的运算组件构造指定规格的 ALU 单元。 设计要求 利用前面实验封装好的 32 位加法器以及 logisim 平台中现有运算部件构建一个 32 位算术逻辑运算单元(禁用 Logisim 系统自带的加法器,减法器),可支持算术加、减、乘、除,逻辑与、或、非、异或运算、逻辑左移、逻辑右移、算术右移运算,支持常用程序状态标志(有符号

gyp0205的博客 2万+

堆排序

堆排序思路 #include <iostream> #include <cstring> #include <cstdlib> #include <vector> #include <cmath> #include <algorithm> #include <set> #include <queue&gt...

李狗嗨acc 266

使用HFSS仿真分支波导耦合器

本文介绍了分支波导耦合器的HFSS仿真设计过程。首先给出了器件关键参数(t=0.365mm,l=1.600mm等),详细说明了建模步骤:包括创建中心分支、设置变量参数、镜像复制两侧分支、矩形波导端口设计等操作。重点阐述了激励端口设置方法,包括四个端口的积分线绘制,以及求解频率设定。最后展示了S参数、幅度平衡度和相位差等关键性能指标的仿真结果提取方法。整个设计过程体现了HFSS在微波器件仿真中的参数化建模和结果分析能力。

shao666888的博客 182

算法学习笔记(5.1)-基于比较的高效排序算法(快速排序,堆排序)

算法学习笔记(5.1)-基于比较的高效排序算法(快速排序,堆排序)

2301_76874968的博客 490

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决

pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。还原数据库时把序列取消勾选,选择不还原序列。因为还原表的同时,会自动将自增序列还原上去,此处勾选会导致数据库重复创建序列。点击还原数据库完毕后,可以看到序列仅有一个,没有出现重复序列。但此时的序列当前值是从1开始的,需要重置。点击菜单“其它”-》“序列”,可以看到有多个重复序列。

奋斗鱼 1044

Appsflyer S2S事件上报实战:从参数获取到避坑指南(附Firebase对比)

本文详细解析了Appsflyer S2S事件上报的实战技巧,包括核心参数获取、测试环境搭建、生产环境最佳实践以及高级场景处理。通过对比Firebase的事件上报机制,帮助开发者高效避坑并优化数据上报流程,提升应用分析与营销效果。

egg99的博客 886

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

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

qq_35344198的博客 1万+

【NodeRed】node-red-contrib-opcua实现PLC读写

在之前的博文【Node-RED】node-red-contrib-opcua-server模块使用(1)中,我们介绍了用node-red-contrib-opcua-server模块实现OPCUA服务端的,以及二次开发的内容。本节博文中我们采用官方社区自带的node-red-contrib-opcua组件开展对OPCUA客户端的介绍,详细阐述用该组件中OpcUa-Client节点实现客户端对PLC的读写,以及实现过程中遇到的问题。由于官方社区中并没有找到该组件的介绍实例,这也是本博文编写的第1个原因。

weixin_48618536的博客 960

堆排序算法

一、堆排序算法基本思想 堆排序是利用堆数据结构而设计的一种排序算法,堆排序是一种选择排序,其最坏,最好,平均时间复杂度均为O(nlogn),同时也是不稳定排序。 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 如下图所示,其中大顶堆的性质**:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]** 每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆,如下图所示,其中小顶堆性质:arr[i] <=

qq_44111805的博客 7790

VC中sqlite的使用

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

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

算法笔记之堆排序

堆排序是一种基于二叉堆的高效排序算法,时间复杂度为O(nlogn)。它首先将无序数组构建成最大堆,然后通过反复交换堆顶元素与末尾元素并调整堆来实现排序。算法包含三个关键步骤:堆调整(维护堆性质)、建堆(从非叶子节点开始调整)和排序阶段(反复提取最大值)。堆排序是原地排序,不需要额外空间,特别适合大规模数据。C语言实现展示了堆调整、建堆和排序的具体操作,通过递归确保子树满足堆性质。最后分析了建堆O(n)和排序O(nlogn)的时间复杂度,强调了算法的高效性和空间优势。

HRDMN的博客 1028

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

十大排序算法之堆排序

在简单选择排序文章中,简单选择排序这个“铁憨憨”只顾着自己做比较,并没有将对比较结果进行保存,因此只能一遍遍地重复相同的比较操作,降低了效率。针对这样的操作,Robertw.Floyd 在1964年提出了简单选择排序的升级版——堆排序方法。堆是什么呢?堆是用数组实现的已标号的完全二叉树。

忆梦九洲的博客 1247

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

排序算法:堆排序

  相关博客: 排序算法:冒泡排序、插入排序、选择排序、希尔排序 排序算法:归并排序、快速排序 排序算法:桶排序、计数排序、基数排序 排序算法:堆排序 十大排序算法小结 一、堆: 1、什么是堆: 堆是一种特殊的树,它满足需要满足两个条件: (1)堆是一种完全二叉树,也就是除了最后一层,其他层的节点个数都是满的,最后一个节点都靠左排列。 (2)堆中每一个节点的值都必须大于等于(...

张维鹏的博客 2789

C语言——快速排序算法——堆排序

堆是一个完全二叉树(Complete Binary Tree),其中每个节点的值都大于等于(或小于等于)其子节点的值,这被称为堆的性质。具体来说,如果每个节点的值都大于等于其子节点的值,我们称之为“最大堆”(Max Heap);如果每个节点的值都小于等于其子节点的值,我们称之为“最小堆”(Min Heap)。例如一个最大堆:堆通常使用数组来实现,其中每个元素对应堆中的一个节点。通过索引关系可以方便地找到父节点、左孩子和右孩子。

qq_34434522的博客 1281

堆排序学习笔记

原理 复杂度分析 bian

big_lobster的专栏 662
上一篇: 数据结构(5)-双端链表
下一篇: 开发者常用网站分享
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

BoringRong

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

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

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

打赏作者

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

抵扣说明:

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

余额充值