十大排序——4.堆排序

news2024/10/5 6:22:33

前面我们讲了堆,现在我们来看一下队排序。

堆排序的步骤:

  • 首先将一个无序数组建立成一个大顶堆
  • 然后,将堆顶的元素和堆低的元素进行交换(即将最大的元素交换的到堆底),缩小并下潜调整堆
  • 重复上一步,直到堆中只剩一个元素为止

下面来看一下代码实现:

下面看一下具体的代码:

package Sorts;
//堆排
public class HeapSort {
    public static void main(String[] args) {
        int[] arr = {16, 7, 3, 20, 17, 8};
        heapSort(arr);
        for (int i : arr) {
            System.out.print(i + " ");
        }
    }
    /**
     * 创建堆
     */
    private static void heapSort(int[] arr) {
        //创建堆
        for (int i = (arr.length - 1) / 2; i >= 0; i--) {
            //从第一个非叶子结点从下至上,从右至左调整结构
            adjustHeap(arr, i, arr.length);
        }

        //调整堆结构+交换堆顶元素与末尾元素
        for (int i = arr.length - 1; i > 0; i--) {
            //将堆顶元素与末尾元素进行交换
            int temp = arr[i];
            arr[i] = arr[0];
            arr[0] = temp;
            //重新对堆进行调整
            adjustHeap(arr, 0, i);
        }
    }
    /**
     * 调整堆
     * @param arr 待排序列
     * @param parent 父节点
     * @param length 待排序列尾元素索引
     */
    private static void adjustHeap(int[] arr, int parent, int length) {
        //将temp作为父节点
        int temp = arr[parent];
        //左孩子
        int lChild = 2 * parent + 1;
        while (lChild < length) {
            //右孩子
            int rChild = lChild + 1;
            // 如果有右孩子结点,并且右孩子结点的值大于左孩子结点,则选取右孩子结点
            if (rChild < length && arr[lChild] < arr[rChild]) {
                lChild++;
            }
            // 如果父结点的值已经大于孩子结点的值,则直接结束
            if (temp >= arr[lChild]) {
                break;
            }
            // 把孩子结点的值赋给父结点
            arr[parent] = arr[lChild];
            //选取孩子结点的左孩子结点,继续向下筛选
            parent = lChild;
            lChild = 2 * lChild + 1;
        }
        arr[parent] = temp;
    }
}

堆排序主要就是运用了堆的特性,对于堆,堆元素的下潜操作一顶要熟悉。

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

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

相关文章

Mac文件搜索工具HoudahSpot 6.4.1中文版

HoudahSpot是一款Mac电脑上的文件搜索工具&#xff0c;它可以帮助用户快速准确地找到文件和文件夹&#xff0c;支持高级搜索和过滤&#xff0c;同时提供了多种视图和操作选项&#xff0c;方便用户进行文件管理和整理。 HoudahSpot的主要特点包括&#xff1a; 高级搜索和过滤功…

HashMap中的hash 方法

HashMap中的hash方法为什么要右移 16 位异或&#xff1f; 之所以要对 hashCode 无符号右移 16 位并且异或&#xff0c;核心目的是为了让 hash 值的散列度更高&#xff0c;尽可能减少 hash 表的 hash 冲突&#xff0c;从而提升数据查找的性能。 HashMap 的 put 方法 在 HashMap …

Halcon模板匹配

halcon 创建模板 1、先用摄像头读取一张图片 2、在图片上画出模板 3、连续读取图片&#xff0c;进行模板匹配 dev_close_window ()* Image Acquisition 01: Code generated by Image Acquisition 01 open_framegrabber (GigEVision2, 0, 0, 0, 0, 0, 0, progressive, -1, def…

UI 自动化测试框架:PO 模式+数据驱动 【详解版】

目录 1. PO 设计模式简介 什么是 PO 模式&#xff1f; PO 模式的优点 2. 工程结构简介 工程结构 框架特点 3. 工程代码示例 page 包 action 包 business_process 包 util 包 conf 包 1. PO 设计模式简介 什么是 PO 模式&#xff1f; PO&#xff08;PageObject&am…

docker 配置 gpu版pytorch环境--部署缺陷检测--Anomalib

目录 一、docker 配置 gpu版pyhorch环境1、显卡驱动、cuda版本、pytorch cuda版本三者对应2、拉取镜像 二、部署Anomalib1、下载Anomalib2、创建容器并且运行3、安装Anomalib进入项目路径安装依赖测试&#xff1a; 一、docker 配置 gpu版pyhorch环境 1、显卡驱动、cuda版本、p…

mac安装运行superset及踩坑解决过程

介绍 Apache Superset 是一个现代的企业级商业智能 Web 应用程序。它快速、轻量、直观&#xff0c;并加载了各种选项&#xff0c;使所有技能的用户都可以轻松探索和可视化他们的数据&#xff0c;从简单的饼图到高度详细的 Deck.gl 地理空间图表。 安装 首先安装自制homebrew安…

Zabbix之SNMP的OID获取

在配置zabbix监控的时候,配置监控项最为麻烦,一般我们都会套用模板,这种方式比较简单,但是有些设备就是没有现成的zabbix模板,怎么办? 今天我们使用MIB Browser来获取设备SNMP的OID,然后加入zabbix 。 1.什么是MIB Browser SNMP客户端工具MIB Browser, 全名iReasonin…

Docker 安装MySQL(主从复制)

1、新建主服务器容器实例3307 docker run -p 3307:3306 --name mysql-master \ -v /mydata/mysql-master/log:/var/log/mysql \ -v /mydata/mysql-master/data:/var/lib/mysql \ -v /mydata/mysql-master/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORDroot \ -d mysql:5.7 2、进入…

二、vue2脚手架-组件化开发

| vue中的图片打包后会转换为base64格式 组件的使用 1.创建组件&#xff1a;component文件夹中创建HelloWorld.vue文件 2.在app.vue中引入组件 组件间的通信/传值&#xff08;常用&#xff09; 一、prop父传子 1.App.vue中的引入组件中创建需要传递的数据 2.在子组件中接…

LMS软件打开方式+激振器使用说明(笔记)

1.直接打开会报错 2.需要找到rlm.exe&#xff0c;打开此软件后再打开LMS软件 注&#xff1a;有时候会有进程残留&#xff0c;需要在任务管理器里结束LMS.exe或lms.exe或rlm.exe才能打开软件 3.激振器使用说明 前端接out1/out2口&#xff0c;功放接AC输入 3.1 设置参考点 3.2 …

记一次逆向某医院挂号软件的经历

背景 最近家里娃需要挂专家号的儿保&#xff0c;奈何专家号实在过于抢手&#xff0c;身为程序员的我也没有其他的社会资源渠道可以去弄个号&#xff0c;只能发挥自己的技术力量来解决这个问题了。 出师不利 首先把应用安装到我已经 Root 过的 Pixel 3 上面&#xff0c;点击应…

共享剪切板小工具

共享剪切板小工具 使用场景&#xff1a;手机/平板/其他设备发送消息到电脑剪切板。使用于电脑不能联网或者不方便使用微信等其他方式发送文字。例如&#xff1a;不能跳出当前页面可以通过其他设备直接发送到剪切板上&#xff0c;ctrlV 完美 使用限制&#xff1a;目前仅支持在局…

大数据——Spark SQL

1、Spark SQL是什么 Spark SQL是Spark中用于处理结构化数据的一个模块&#xff0c;前身是Shark&#xff0c;但本身继承了前身Hive兼容和内存列存储的一些优点。Spark SQL具有以下四个特点&#xff1a; 综合性(Integrated)&#xff1a;Spark中可以加入SQL查询&#xff0c;也可…

啥子是DOM???总听,不晓得啥

远古时代&#xff0c;浏览器加载完HTML页面就没了&#xff0c;也就是加载一个文本。 但是之后JS出现&#xff0c;要修改HTML文本&#xff0c;这么大的文本&#xff0c;你咋晓得要修改那个地方&#xff1f;就算修改完了浏览器还要在重新解析加载一遍&#xff0c;耗时耗性能啊&a…

oracle11g-图形安装(centos7)

目录 一.环境准备1.关闭防火墙2.关闭SELINUX3.配置本地yum源4.安装ORACLE先决条件的软件包5.修改LINUX的内核文件6.添加下列参数到/etc/security/limits.conf7.添加下列条目到/etc/pam.d/login8.环境变量中添加下列语句9.创建文件目录和相应的用户10.配置oracle用户的环境变量1…

Java笔记:垃圾回收

1 判断算法垃圾 主要是2种&#xff1a;引用计数法和根搜索算法 1.1 引用计数法&#xff08; Reference Counting&#xff09; 1. 概念 给对象中添加一个引用计数器&#xff0c;每当有一个地方引用它时&#xff0c;计数器值就加1&#xff1a;当引用失效时&#xff0c;计数器值…

【Linux】系统编程生产者消费者模型(C++)

目录 【1】生产消费模型 【1.1】为何要使用生产者消费者模型 【1.2】生产者消费者模型优点 【2】基于阻塞队列的生产消费者模型 【2.1】生产消费模型打印模型 【2.2】生产消费模型计算公式模型 【2.3】生产消费模型计算公式加保存任务模型 【2.3】生产消费模型多生产多…

行行AI人工智能大会 | LTD荣获“AI强应用创新TOP50代表企业”

LTDAI重新定义下一代网站。9月20日&#xff0c;由行行AI和见实科技、梅花创投联合主办&#xff0c;以“强应用多模型——人工智能落地大潮”为主题的“2023年度见实大会”在京顺利召开。 9月20日&#xff0c;由行行AI和见实科技、梅花创投联合主办&#xff0c;以“强应用多模型…

python使用apscheduler每隔一段时间自动化运行程序

apscheduler使用比较简单&#xff0c;每隔一段时间自动化运行的步骤是&#xff1a; 创建调度器scheduler BlockingScheduler()添加任务scheduler.add_job(函数名, interval, minutes30) # 每隔30分钟运行一次直接执行&#xff1a;scheduler.start()示例代码 from datetime i…

一花落,万物生,AIGC为国货复兴注入新活力

在最近的商业新闻中&#xff0c;国货们发“花难财”的热度持续在涨&#xff0c;“花西子”曾经是中国国货的代表之一&#xff0c;以其独特的美妆产品而闻名于世。然而&#xff0c;近期因为李佳琦“79块钱哪里贵了”事件的原因&#xff0c;让不少网友扒出这支79的眉笔算下来一克…