当前位置: 首页 > news >正文

排序算法之堆排序


title: 堆排序
date: 2024-7-23 15:48:25 +0800
categories:

  • 排序算法
    tags:
  • 排序
  • 算法
  • 堆排序
    description: 堆排序(Heap Sort)是一种基于堆的排序算法,具有较高的效率和稳定性。
    math: true

堆排序

堆排序(Heap Sort)是一种基于堆的排序算法,具有较高的效率和稳定性。堆排序利用堆这种完全二叉树的数据结构进行排序,常用的是大顶堆(最大堆)来实现升序排序。本文将详细介绍堆排序的原理、步骤、示例、复杂度分析及其Java代码实现。

堆排序的原理

  1. 堆的定义:堆是一种完全二叉树,其中每个节点的值都大于或等于其左右子节点的值,这种堆称为大顶堆;每个节点的值都小于或等于其左右子节点的值,这种堆称为小顶堆。
  2. 通常堆是通过一维[数组]来实现的。在数组起始位置为0的情形中:
  • 父节点i的左子节点在位置 ( 2 i + 1 ) (2i+1) (2i+1);
  • 父节点i的右子节点在位置 ( 2 i + 2 ) (2i+2) (2i+2);
  • 子节点i的父节点在位置 ( i − 1 ) / 2 (i−1)/2 (i1)/2;
  1. 堆排序的基本思想
    • 将待排序的数组构造成一个大顶堆。
    • 取出堆顶元素(当前堆中最大值),将其与堆的最后一个元素交换。
    • 调整堆结构,使其满足堆的性质,重复上述步骤直到整个数组排序完成。

堆排序的步骤

  1. 构建初始堆:将无序数组构建成一个大顶堆。
  2. 交换堆顶元素与末尾元素:将堆顶元素(最大值)与末尾元素交换。
  3. 调整堆:将剩余元素重新调整为大顶堆。
  4. 重复步骤2和3,直到所有元素有序。

图示

堆排序

示例

堆排序示例

复杂度分析

  • 时间复杂度为 O ( n log ⁡ n ) O(n \log n) O(nlogn)、非自适应排序:建堆操作使用 O ( n ) O(n) O(n) 时间。从堆中提取最大元素的时间复杂度为 O ( log ⁡ n ) O(\log n) O(logn) ,共循环 n − 1 n - 1 n1 轮。

  • 空间复杂度为 O ( 1 ) O(1) O(1)、原地排序:几个指针变量使用 O ( 1 ) O(1) O(1) 空间。元素交换和堆化操作都是在原数组上进行的。

  • 非稳定排序:在交换堆顶元素和堆底元素时,相等元素的相对位置可能发生变化。

时间复杂度

  • 所有时间复杂度 O ( n log ⁡ n ) O(n \log n) O(nlogn)

空间复杂度

  • 空间复杂度 O ( 1 ) O(1) O(1)

堆排序的代码实现(Java)

public class HeapSort {// 主排序函数public static void heapSort(int[] arr) {int n = arr.length;// 构建初始大顶堆,从非叶子结点的元素处开始遍历for (int i = n / 2 - 1; i >= 0; i--) {heapify(arr, n, i);}// 逐步将堆顶元素与末尾元素交换,并调整堆for (int i = n - 1; i > 0; i--) {// 将当前堆顶元素与末尾元素交换int temp = arr[0];arr[0] = arr[i];arr[i] = temp;// 调整堆heapify(arr, i, 0);}}// 调整堆public static void heapify(int[] arr, int n, int i) {int largest = i; // 当前节点int left = 2 * i + 1; // 左子节点int right = 2 * i + 2; // 右子节点// 如果左子节点大于当前节点,则更新最大值if (left < n && arr[left] > arr[largest]) {largest = left;}// 如果右子节点大于当前节点,则更新最大值if (right < n && arr[right] > arr[largest]) {largest = right;}// 如果最大值不是当前节点,则交换,并递归调整堆if (largest != i) {int swap = arr[i];arr[i] = arr[largest];arr[largest] = swap;//如果交换了,需要确认被交换的叶子节点仍然是个大顶堆heapify(arr, n, largest);}}// 主函数public static void main(String[] args) {int[] arr = {38, 27, 43, 3, 9, 82, 10};System.out.println("Given Array:");for (int num : arr) {System.out.print(num + " ");}System.out.println();// 调用堆排序函数heapSort(arr);System.out.println("\nSorted Array:");for (int num : arr) {System.out.print(num + " ");}System.out.println();}
}

相关文章:

排序算法之堆排序

title: 堆排序 date: 2024-7-23 15:48:25 0800 categories: 排序算法 tags:排序算法堆排序 description: 堆排序&#xff08;Heap Sort&#xff09;是一种基于堆的排序算法&#xff0c;具有较高的效率和稳定性。 math: true 堆排序 堆排序&#xff08;Heap Sort&#xff09;是…...

Python中的NLP宝库:探索顶级库与工具

标题&#xff1a;Python中的NLP宝库&#xff1a;探索顶级库与工具 Python&#xff0c;作为人工智能和机器学习任务中的关键编程语言&#xff0c;为自然语言处理&#xff08;NLP&#xff09;提供了丰富的库和工具。这些库不仅功能强大&#xff0c;而且大多数都是开源的&#xf…...

springboot + springcloud + Google pubsub+ firebase

1.pom依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-gcp-starter</artifactId><version>1.2.6.RELEASE</version></dependency><dependency><groupId>org.springframe…...

时序数据库TDengine和QuestDB对比

QuestDB和TDengine都是高性能的时序数据库&#xff08;Time Series Database, TSDB&#xff09;&#xff0c;但它们在设计、功能、适用场景以及性能表现上各有特色。 以下是对两者的详细对比&#xff1a; 一、设计与架构 QuestDB 是一个开源的高性能SQL时序数据库&#xff0…...

Neuralink的进展与马斯克的技术愿景——从脑机接口到AI融合的未来

引言 Neuralink&#xff0c;这个由埃隆马斯克&#xff08;Elon Musk&#xff09;创立的公司&#xff0c;一直是科技界的焦点。自从其发布以来&#xff0c;Neuralink的脑机接口技术便吸引了全球的目光。最近&#xff0c;马斯克再次向公众展示了Neuralink的突破性进展&#xff0…...

大数据技术——实战项目:广告数仓(第四部分)

目录 第7章 数据仓库环境准备 7.1 数据仓库运行环境 7.1.1 Hive环境搭建 7.1.2 Yarn环境配置 7.2 数据仓库开发环境 第8章 广告数仓ODS层 8.1 广告信息表 8.2 推广平台表 8.3 产品表 8.4 广告投放表 8.5 日志服务器列表 8.6 广告监测日志表 8.7 数据装载脚本 第7章…...

cmake+ninja交叉编译android下的静态库

文章目录 cmakeninja案例背景重新安装ninja编译通过 参考 想整理一个库的cmake工程&#xff0c;他用 cmakeninja 简单了解了一下&#xff0c;是可以不依赖Android studio编译的cmake的&#xff0c;搜到了一个cmakeninja&#xff0c;参考[1] 案例 参考[1]中的代码 背景 cm…...

Vue项目-Table添加Form表单校验

一、HTML <template><div class"taskInfo"><el-form:model"generateParams":rules"formRules"ref"formRef"class"taskInfoForm"label-width"100px"><ul class"taskInfoSearch"&g…...

【iOS】—— 事件传递链和响应者链总结

事件传递链和响应者链总结 1. 事件传递链&#xff1a;事件传递链&#xff1a;传递流程&#xff1a;总结第一响应者&#xff1a; 2. 响应者链响应者链传递流程总结响应者链流程 总结&#xff1a; 之前也学习过这个内容这次在复习的时候&#xff0c;就想着写一下总结&#xff1a;…...

【多线程】初识进程和线程

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;多线程 / javaEE初阶 前言 在我们之前编写的所有代码&#xff0c;都只能用上一个核心。众所周知&#xff0c;现在大多数CPU都有多个核心&#xff0c;但此时&#xff0c;无论如法优化程序&#xff0c…...

1DCNN-2DResNet并行故障诊断模型

往期精彩内容&#xff1a; Python-凯斯西储大学&#xff08;CWRU&#xff09;轴承数据解读与分类处理 Python轴承故障诊断入门教学-CSDN博客 Python轴承故障诊断 (13)基于故障信号特征提取的超强机器学习识别模型-CSDN博客 Python轴承故障诊断 (14)高创新故障识别模型-CSDN…...

Java设计模式(原型模式)

定义 使用原型实例指定待创建对象的类型&#xff0c;并且通过复制这个原型来创建新的对象。 角色 Prototype&#xff08;抽象原型角色&#xff09; ConcretePrototype&#xff08;具体原型角色&#xff09; Client&#xff08;客户端角色 优点 简化对象的创建过程&#xff0c…...

C/C++ 知识点:typedef 关键字

文章目录 一、typedef 关键字1、 基本用法2、常见用法2.1、为基本数据类型定义别名2.2、为结构体或联合体定义别名2.3、为指针类型定义别名2.4、为复杂模板类型定义别名 3、注意事项4、总结 前言&#xff1a; 在C&#xff08;以及C语言&#xff09;中&#xff0c;typedef 关键字…...

【Linux学习】进程间通信之 匿名管道 与 基于管道的进程池

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f351;进程间通信&#x1f42c;进程间通信目的 &#x1f4da;管道 &#x1f4d5;管道的原理&#x1f427;用fork来共享管道原…...

小团队如何选需求管理软件?8款顶级推荐

本文将分享8款适合小团队的需求管理软件&#xff1a;PingCode、Worktile、Tapd、Teambition、禅道、Asana、Jama Connect、Aha!。 在小团队中管理需求时&#xff0c;寻找合适的软件工具常常让人头疼&#xff0c;不同的需求管理软件提供各种功能&#xff0c;但哪些功能真正适合…...

docker操作入门

1.创建镜像&#xff0c;使用当前文件 docker build -t experience . 2.运行容器 docker run -d -p 8501:8501 --name my-running-app my-python-api docker run -p 8508:8508 experience docker run -p 8508:8508 -p 8509:8509 experience 3.查看容器状态 docker ps docker p…...

简单的射箭小游戏网页源码

简单的射箭小游戏网页源码,对准靶心开启你的射击之旅吧 微信扫码免费获取源码...

Python | Leetcode Python题解之第331题验证二叉树的前序序列化

题目&#xff1a; 题解&#xff1a; class Solution:def isValidSerialization(self, preorder: str) -> bool:pre 1for i in preorder.split(,):if i.isdigit():if pre 0:return Falsepre 1else:if pre 0:return Falsepre - 1return pre 0...

0x3 “护网行动”守之道

一、护网防守目标系统 二、护网防守之利器 通过安全流程控制、安全技术保障、安全工具支撑、安全能力提升四个层次全面构成安全防御体系。 安全技术名称解释 IPS&#xff08;入侵防御系统&#xff09;WAF&#xff08;Web应用防火墙&#xff09;IDS&#xff08;入侵检测系统&a…...

白骑士的Matlab教学高级篇 3.1 高级编程技术

系列目录 上一篇&#xff1a;白骑士的Matlab教学进阶篇 2.5 Simulink 高级编程技术在MATLAB中扮演着至关重要的角色&#xff0c;帮助用户更高效地编写复杂程序、提高代码的可维护性和可读性。本节将介绍面向对象编程、函数句柄与回调函数、错误处理与调试的相关内容。 面向对…...

别再手动点菜单了!用这招让Cadence Virtuoso Schematic效率翻倍(附Net高亮快捷键配置)

电路设计效率革命&#xff1a;Cadence Virtuoso Schematic高阶快捷键配置指南 在集成电路设计的浩瀚宇宙中&#xff0c;Cadence Virtuoso如同设计师手中的光刻机&#xff0c;每一次精准操作都直接影响最终芯片的性能与可靠性。然而&#xff0c;当面对数百个晶体管组成的复杂模…...

AArch64内存管理:MAIR_EL3寄存器详解与应用

1. AArch64内存管理基础与MAIR_EL3寄存器定位 在Armv8-A/v9-A架构中&#xff0c;内存管理单元(MMU)通过多级页表实现虚拟地址到物理地址的转换。当处理器执行内存访问时&#xff0c;MMU会遍历页表条目(Translation Table Entry)&#xff0c;其中包含两个关键信息&#xff1a;目…...

从多路复用到三维光阵:Arduino驱动8x8x8 LED立方体全解析

1. 项目概述&#xff1a;用Arduino点亮一个三维世界几年前&#xff0c;我第一次在创客展上看到一个8x8x8的LED立方体&#xff0c;那种由数百个光点构成的、在三维空间中流动的动画效果&#xff0c;瞬间就把我吸引住了。它不像普通的平面LED屏&#xff0c;而是真正有“深度”的光…...

电容损坏深度诊断,从外观到 ESR精准区分容衰与漏电

在 PCB 故障中&#xff0c;电容损坏占比超 40%&#xff0c;是当之无愧的 “头号杀手”。很多工程师仅靠 “鼓包漏液” 判断电容好坏&#xff0c;殊不知80% 的电容损坏是隐性的—— 外观平整但容值衰减、ESR 升高、轻微漏电&#xff0c;导致供电不稳、系统重启、噪声增大&#x…...

完整指南:如何在5分钟内快速上手BioAge生物年龄计算工具包

完整指南&#xff1a;如何在5分钟内快速上手BioAge生物年龄计算工具包 【免费下载链接】BioAge Biological Age Calculations Using Several Biomarker Algorithms 项目地址: https://gitcode.com/gh_mirrors/bi/BioAge BioAge生物年龄计算工具包是一款基于R语言开发的强…...

API渗透测试:契约驱动的协议/语义/架构三层攻防

1. 为什么“API渗透测试”不是Web渗透的简单延伸&#xff1f;很多人刚接触API安全时&#xff0c;第一反应是&#xff1a;“不就是把Burp Suite抓到的HTTP请求换个参数发一发&#xff1f;跟测网页表单差不多。”我2018年第一次接手某金融类SaaS平台的API安全评估时&#xff0c;也…...

Python Android打包终极指南:5个实战技巧解决移动开发痛点

Python Android打包终极指南&#xff1a;5个实战技巧解决移动开发痛点 【免费下载链接】python-for-android Turn your Python application into an Android APK 项目地址: https://gitcode.com/gh_mirrors/py/python-for-android Python-for-Android&#xff08;简称p4…...

MySQL全局ID生成实战:从自增主键到自定义Sequence的平滑升级方案与避坑指南

MySQL全局ID生成实战&#xff1a;从自增主键到自定义Sequence的平滑升级方案与避坑指南 当电商平台的日订单量突破百万时&#xff0c;技术团队突然发现系统开始频繁出现"Duplicate entry"错误——那些原本可靠的自增主键&#xff0c;在分库分表的环境下变成了数据一致…...

从UE/Unity转战Godot:一个老引擎开发者的踩坑与真香实录

从UE/Unity转战Godot&#xff1a;一个老引擎开发者的踩坑与真香实录 第一次双击Godot图标时&#xff0c;我正坐在堆满Unity参考书的办公桌前。作为用过五年Unity、三年Unreal的"引擎老油条"&#xff0c;我带着审视新玩具的心态点开了这个不到100MB的绿色软件——没想…...

高端展馆数字交互设计,极简科技风多人同屏答题系统

随着城市文旅不断升级&#xff0c;高端展厅、城市规划馆、艺术展馆、文旅综合体逐步走向精细化、品质化、智能化。相较于普通大众展馆&#xff0c;高端场馆对空间美学、设备质感、交互体验、视觉呈现有着严苛标准。在数字化改造过程中&#xff0c;很多场馆容易踩入设计误区&…...