排序算法-堆排序

news2024/11/26 0:23:08

思路

        堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆 来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。       

        我们先将要排序的数据建成堆,然后通过下图所示的步骤进行排序

         特性总结:

        1. 堆排序使用堆来选数,效率就高了很多。

        2. 时间复杂度:O(N*logN)

        3. 空间复杂度:O(1)

        4. 稳定性:不稳定

代码及注释

        

public class HeapSort {
    public static void heapSort(int[]arr){
        //先将数组中的数据创建成堆
        //由于要进行升序排序,所以要创建大根堆
        createBigHeap(arr);
        //此时数组中的数据已经是大根堆了
        //由于大根堆堆顶的数是最大的,所以可以将堆顶的数换到数组最后,然后再将其余的数据转换为大根堆,继续同样的操作
        int length=arr.length;
        for(int i=1;i<length;i++){
            int end=length-i;
            swap(arr,0,end);
            siftDown(arr,0,end);
        }
    }

    private static void createBigHeap(int[]arr){
        //要对拥有子树的节点进行向下调整
        int length=arr.length;
        //遍历所有拥有子树的节点
        for(int i=(length-1-1)/2;i>=0;i--){
            //对父节点向下调整(用两个子树的最大值与父节点的值进行比较,如果父节点小,则交换父节点与子节点)
            siftDown(arr,i,length);
        }
    }
    //向下调整
    //调整根节点parent所在的树,使成为大根堆
    private static void siftDown(int[]arr,int parent,int end){
        //获得父节点parent左子树的下标child
        int child=parent*2+1;
        //child没有超过范围,表示当前的parent确实是父节点
        while (child<end){
            //子节点和父节点交换有以下3种情况
            //1.没有右孩子,此时就比较左孩子与父节点的大小,左孩子大,就交换
            //2.有右孩子,此时比较左孩子与右孩子的大小,要是左孩子大,就比较左孩子与父节点的大小,还是左孩子大,就交换
            //3.有右孩子,此时比较左孩子与右孩子的大小,要是右孩子大,就比较右孩子与父节点的大小,还是右孩子大,就交换
            //判断child此时应该指向左孩子还是右孩子,child一开始指向的是左孩子,经过判断后,child会指向比较大的那个孩子
            if(child+1<end&&arr[child]<arr[child+1]){
                child=child+1;
            }
            //判断比较大的子孩子与父节点之间的大小关系
            if(arr[child]>arr[parent]){
                swap(arr,child,parent);
            }

            //可能交换后对于下一层的树还是不合适,就还要继续进行向下调整
            parent=child;
            child=parent*2+1;
        }
    }

    public static void swap(int[] arr,int m,int n) {
        int tmp=arr[m];
        arr[m]=arr[n];
        arr[n]=tmp;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据分享】上海市道路中心线数据(无需转发\单线\shp格式)

道路数据是我们在各项研究中经常使用的数据&#xff0c;我们一般获取到的数据都是多线道路&#xff08;也就是一条道路上有多条线来表示&#xff09;&#xff0c;这种多线道路并不适用于交通网络分析等操作中&#xff0c;很多时候我们需要单线道路数据&#xff0c;也就是道路中…

基于协同过滤算法的旅游推荐系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

接口自动化测试中解决接口间数据依赖

在实际的测试工作中&#xff0c;在做接口自动化测试时往往会遇到接口间数据依赖问题&#xff0c;即API_03的请求参数来源于API_02的响应数据&#xff0c;API_02的请求参数又来源于API_01的响应数据。 因此通过自动化方式测试API_03接口时&#xff0c;需要预先请求API_02接口&a…

马来西亚市场最全开发攻略

东盟有十个国家&#xff0c;人口接近6亿&#xff0c;已连续13年成为我国最大贸易伙伴之一。数据显示&#xff0c;1-7月中国与东盟贸易总值为3.59万亿元&#xff0c;同比增长2.8%。东盟成员国中&#xff0c;与中国前三大贸易伙伴依次为越南、马来西亚和印度尼西亚。 今天来聊一…

2023.8.13百度之星(第二场)第一题官方题解注释说明

第一题&#xff1a;星际航行 #include<bits/stdc.h> using namespace std; int n, a[3][100010]; int tmp[100010]; long long calc(int *a,int opt){//opt等于0表示回合到同一个点花费的最小代价&#xff0c;opt等于1表示将数列排序成连续的整数数列for(int i1;i<n;i…

Spring基础(2w字---学习总结版)

目录 一、Spirng概括 1、什么是Spring 2、什么是容器 3、什么是IoC 4、模拟实现IoC 4.1、传统的对象创建开发 5、理解IoC容器 6、DI概括 二、创建Spring项目 1、创建spring项目 2、Bean对象 2.1、创建Bean对象 2.2、存储Bean对象&#xff08;将Bean对象注册到容器…

DevEco Studio中如何设置HarmonyOS/OpenHarmony应用开发

DevEco Studio内置有帮助中心&#xff0c;初学HarmonyOS 及OpenHarmony应用、元服务的开发者&#xff0c;通过内置的帮助中去系统的学习相关内容&#xff0c;是边练边学&#xff0c;快速上手的最佳方式。 一、帮助 二、快速开始 三、HarmonyOS应用、元服务开发相关 四、OpenHa…

c语言练习57:浮点数在内存中的存储

浮点数在内存中的存储 上⾯的代码中&#xff0c; num 和 *pFloat 在内存中明明是同⼀个数&#xff0c;为什么浮点数和整数的解读结果会差别 这么⼤&#xff1f; 要理解这个结果&#xff0c;⼀定要搞懂浮点数在计算机内部的表⽰⽅法。 根据国际标准IEEE&#xff08;电⽓和电⼦⼯…

自建私人图床方案:使用Cpolar+树洞外链轻松部署超轻量级图床,实现高效图片存储

文章目录 1.前言2. 树洞外链网站搭建2.1. 树洞外链下载和安装2.2 树洞外链网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3 Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测试5.结语…

Linux上防火墙操作

开放关闭防火墙 查看防火墙状态的命令&#xff1a;systemctl status firewalld 或者 firewall-cmd --state 暂时关闭防火墙的命令&#xff1a;systemctl stop firewalld 暂时开启防火墙的命令&#xff1a;systemctl start firewalld 永久关闭防火墙(禁用开机自启)下次启动&a…

[Linux]进程信号

[Linux]进程信号 文章目录 [Linux]进程信号进程信号的定义信号的特点信号的生命过程发送信号的原理进程处理信号的方式分类使用指令查看Linux系统定义的信号信号产生使用终端按键产生信号使用指令向进程发送信号调用系统调用向进程发送信号由软件条件产生信号硬件异常产生信号 …

超轻巧的电竞鼠标,手感不错反应精准,雷柏VT9Pro体验

作为一家国内很受欢迎的外设厂商&#xff0c;雷柏近年推出了不少很有创新性的产品&#xff0c;像是之前主打轻量化的鼠标VT9&#xff0c;凭借78g的超轻重量&#xff0c;以及模块化的设计&#xff0c;得到了了广大游戏玩家的认可。最近雷柏在此基础上又推出了一款VT9 Pro&#x…

Linux服务使用宝塔面板搭建网站,并发布公网访问

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 前言 宝塔面板作为简单好用的服务器运维管理面板&#xff0c;它支持Linux/Windows系统&#xff0c;我们可用它来一键配置LAMP/LNMP环境、网站、数据库、FTP等&…

ChatGPT帮助一名儿童确诊病因,之前17位医生无法确诊

9月13日&#xff0c;Today消息&#xff0c;一位名叫Alex的4岁儿童得了一种浑身疼痛的怪病&#xff0c;每天需要服用Motrin&#xff08;美林&#xff09;才能止痛。3年的时间&#xff0c;看了17名医生无法确诊病因。&#xff08;新闻地址&#xff1a;https://www.today.com/heal…

短视频批量剪辑--矩阵源码---无人直播如何搭建技术开发

一、核心技术&#xff1a; 1.AI自动直播 智能系统通过丰富可定制的文案库&#xff0c; 拥有有料有趣的灵魂。不仅能自动语音讲解内容&#xff0c; 还可以在直播中和用户灵活互动。直播中可将团购商品同话术自动上下架。 2.AI剪辑 可一键智能批量成片&#xff0c;也可跟着模…

Imu水平放置时的Z轴分量为什么是正值?

前言 常见的一些疑问: 水平放置时&#xff0c;imu的z轴的值是正值&#xff0c;难道imu的z轴是朝下&#xff1f;水平往前倾&#xff0c;根据各轴的读数值&#xff0c;觉得imu的坐标系难道是左手系&#xff1f; 基于以上两个疑问&#xff0c;下面我将按我的理解解释一下。 解…

开箱即⽤!HashData 云数仓上线华为蓝鲸应⽤商城

近⽇&#xff0c;经过华为对企业技术、产品和服务能⼒的综合评估&#xff0c;酷克数据企业级云原⽣数据仓库HashData通过与华为OceanStor Pacific 分布式存储的适配与优化&#xff0c;形成⼀体化解决⽅案&#xff0c;成功上线华为蓝鲸应⽤商城。 图 1&#xff1a;华为蓝鲸商城…

【vue组件】使用element-ui table 实现嵌套表格 点击展开时获取数据

应用场景是这样 主表格的数据是所有的学校 然后点击展开的时候&#xff0c;获取学校下相应班级的数据 并且班级要能选择后生成图表&#xff0c;但所有的班级最多选择5个 首先是嵌套表格 <div><el-table:data"tableDisplayData"id"chartTableExpand&q…

bwapp下载安装

下载地址&#xff1a; https://sourceforge.net/projects/bwapp/ 安装&#xff1a; 解压缩 将压缩包解压到www目录 进入bwapp/admin/,打开setting.php文件&#xff0c;修改数据库用户名密码 安装数据库 打开浏览器&#xff0c;输入 http://localhost/bwapp/bwapp/install.p…

微服务简介

微服务简介 微服务架构是一种软件架构模式&#xff0c;它将一个大型应用程序拆分为一组小型、独立的服务&#xff0c;每个服务都有自己的业务逻辑和数据存储。这些服务可以独立开发、部署和扩展&#xff0c;通常使用HTTP或其他轻量级通信协议进行通信。 以下是微服务架构的一…