排序算法(5)----堆排序

2023-10-29

这篇博客从以下几个方面来说:

  1. 什么是最大堆以及代码实现
  2. 堆排序基础代码
  3. 一次优化(提高效率)
  4. 二次优化(原地堆排序,无需额外空间)


1.什么是最大堆以及代码实现

这里可以参考言简意赅的博客:堆与最大堆


2.堆排序基础代码

import com.heap.MaxHeap;
import utils.CreateRandom;

public class HeapSort {
    //堆排序,将需要排序的数组中的元素全部依次入堆,然后反向的取出最大值.
    // 算法复杂度 O(n * log n)
    public static int[] heapSort_1(int[] arr) {
        MaxHeap maxHeap = new MaxHeap(arr.length);
        for (int anArr : arr) {
            maxHeap.insert(anArr);
        }
        for (int i = arr.length - 1; i >= 0; i--) {
            arr[i] = maxHeap.extrackMax();
        }
        return arr;
    }
}


3.一次优化

import com.heap.MaxHeap;
import utils.CreateRandom;

public class HeapSort {
    /*优化1:Heapify
    * 最大堆特性:
    *       一个没有子节点的节点,可以看做是只有一个根节点的堆,
    *       arr[count / 2] 即为堆中第一个拥有节点的节点
    * 因此只需要从下向上的,依次执行shiftDown操作,由小的堆逐渐变成大的堆就可以了
    * 算法复杂度 O(n)
    * */
    public static int[] heapSort_2(int[] arr) {
        MaxHeap maxHeap = new MaxHeap(arr);
        //在向 MaxHeap 中传入 arr 数组后,整个数组已经满足最大堆
        for (int i = arr.length - 1; i >= 0; i--) {
            arr[i] = maxHeap.extrackMax();
        }
        return arr;
    }
}


4.二次优化(原地堆排序)

import com.heap.MaxHeap;
import utils.CreateRandom;

public class HeapSort {
    /*优化2:原地堆排序
    * 在最大堆中,将第一个位置的值(同时也是最大值)与数组最后一个位置交换位置,在原数组的基础上直接得到有序数组,
    * 而不需要开辟新的数组空间来存储堆中排好序的元素.
    * */
    public static int[] heapSort_3(int[] arr) {
        MaxHeap maxHeap = new MaxHeap(arr);
        return maxHeap.sortInside();
    }
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

排序算法(5)----堆排序 的相关文章

随机推荐

  • 取消springsecurity默认的登录验证

    取消springsecurity默认的登录验证 问题描述 解决方法一 方法二 问题描述 springboot 2 x 访问swagger ui html时 会自动跳转到springsecurity的login页 自定义过滤路径的拦截器无效
  • 详解FreeRTOS中的软件定时器

    软件定时器用于让某个任务定时执行 或者周期性执行 比如设定某个时间后执行某个函数 或者每隔一段时间执行某个函数 由软件定时器执行的函数称为软件定时器的回调函数 参考资料 Mastering the FreeRTOS Real Time Ke
  • 公司企业怎么做一个网站?

    怎么做一个网站对于一些实体的公司企业来说是个需要了解的问题 由于实体公司企业大部分情景下都是线下面谈业务 所以他们一开始并没有搭建自己的公司企业网站 而到了现在逐渐发展的阶段 就开始需要公司企业网站来开拓更多的客户资源或是提高公司企业的曝光
  • 这是一套基于THINKPHP6+SCUI+VUE2.6开发的CRM客户管理系统

    这是一套基于THINKPHP6 SCUI VUE2 6开发的CRM客户管理系统 演示 http v2 antsys cn 用户名admin 密码123456
  • 基于 webpack 5 实现自定义 loader

    前面的话 基于 webpack 5 创建自定义 同步 异步loader 在此基础上实现一个简易的渲染 markdown 的 loader 和 合成雪碧图的 loader 代码地址 自定义loader 准备工作 我们先创建一个 webpack
  • MacOS无法使用arduinoIDE解决方法

    1 当arduino ide版本过低时m1mac可能无法使用 出现可能是因为版本过低 Arduino 1 8 8 Mac OS X 开发板 Arduino Genuino Mega or Mega 2560 ATmega2560 Mega
  • 不能使用QtCreator debug Qt代码思路之一

    不能使用QtCreator debug Qt代码思路之一 在工程文件 pro中查找是否有 CONFIG release这样的配置 将它注释掉就可以开始debug了
  • ping www.baidu.com,显示name or service is not know

    相信许多网友都遇到过 前一天使用centos 还没有问题 第二天打开是 突然发现ping www baidu com 显示name or service is not know 大家可以打开windows任务管理器 找到服务 确保NAT正在
  • 类模板的特化

    你可以用模板实参来特化类模板 和函数模板的重载类似 通过特化类模板 你可以优化基于某种特定类型的实现 或者克服某种特定类型在实例化类模板时所出现的不足 另外 如果要特化一个类模板 你还要特化该类模板的所有成员函数 虽然也可以只特化某个成员函
  • Spring-@Value用法介绍

    Value在开发中最常使用的几个注解之一 通常用来获取配置文件中的属性 不过除了从配置文件中获取值 Value还支持使用默认值 表达式等方式为变量设置值 本文就针对 Value的使用进行分享 Value用法 Value中直接设置值 顾名思义
  • 【目标检测-YOLO】YOLOv5-v6.0-yolov5s网络架构详解(第一篇)

    1 准备工作 趁热打铁 上节分析了 v5 0 的 yolov5s 模型架构 本节顺便把 v6 0的图也画下 官方代码中贴心的给提供了 onnx 文件 如下图 但是 当我打开 onnx 的时候 我麻了 所以 还是需要自己生成下 onnx 文件
  • LIVE555研究之三:LIVE555基础

    LIVE555基础 LIVE555是为流媒体提供解决方案的跨平台C 开源项目 从今天起我们将正式开始深入LIVE555代码 一 各库简要介绍 LIVE555下包含LiveMedia UsageEnvironment BasicUsageEn
  • HTML——前端实时可视化开发工具

    前端实时可视化开发工具 liveStyle liveReload Broswer Sync 一 liveStyle 如图 liveStyle支持三种文件 需要安装两个插件 浏览器的插件 sublime编辑器中的livestyle插件 浏览器
  • 给定一个二叉树, 找到该树中两个指定节点p和q(数值唯一)的最近公共祖先

    递归思想 判断p和q是否分别根结点的左右两侧 如果在左右两侧那么直接返回根结点即可 不失一般性 假设p和q分别均在根结点的左侧 那么按照分治的思想 此时继续往左子树找即可 问题规模已经缩小 那么依旧还是上面的操作划分 故可以采用递归的思想
  • 力扣第48天--- 第739题、第496题

    力扣第48天 第739题 第496题 文章目录 一 第739题 每日温度 二 第496题 下一个更大元素 I 一 第739题 每日温度 单调栈里放的是下标 适用场景 对于数组中某一元素 寻找右边 左边第一个大于或者小于这个元素的位置 单调栈
  • flutter - 点击事件(二) - 给图片增加点击UI效果

    上一篇 介绍了如何便利的构造一个自己的点击控件 flutter 中 如果给图片外面套 InkWell 你会发现点击的逻辑生效了 但是 UI 上没反应 备注 图片来源 违反版权请联系我 删除 代码如下 import package flutt
  • 51单片机——串口通信

    51单片机 串口通信 串口通信 串口通信的原理 串口的配置 定时器的配置 c源代码 netty源代码 结果 本篇博客的最终效果是实现51单片机用串口发送Hello World netty监听串口读到Hello World后回发给51单片机
  • 【Device Tree】Android DTS 加载流程

    前言 在之前的文章中已经对设备树的基本概念作了讲解 操作系统 例如在 Android 中使用的 Linux 内核 会使用 DT 来支持 Android 设备使用的各种硬件配置 硬件供应商 ODM 会提供自己的 DT 源文件 接下来 Linu
  • sql server: 数据库备份时出现-operating-system-error-5拒绝访问

    sql server 数据库备份时出现 operating system error 5拒绝访问 一般备份文件选择的目录为磁盘根目录或备份所选分区未授予sqlserver用户读写权限时会出现此错误 解决办法就是给sqlserver用户授予权
  • 排序算法(5)----堆排序

    这篇博客从以下几个方面来说 什么是最大堆以及代码实现 堆排序基础代码 一次优化 提高效率 二次优化 原地堆排序 无需额外空间 1 什么是最大堆以及代码实现 这里可以参考言简意赅的博客 堆与最大堆 2 堆排序基础代码 import com h