当前位置: 首页 > 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;帮助用户更高效地编写复杂程序、提高代码的可维护性和可读性。本节将介绍面向对象编程、函数句柄与回调函数、错误处理与调试的相关内容。 面向对…...

立体视觉入门避坑:为什么你的双目深度估计总是不准?从标定到匹配的5个常见误区

立体视觉实战指南&#xff1a;深度估计不准的五大技术陷阱与解决方案 刚完成双目标定的工程师们常会遇到这样的困境&#xff1a;明明按照教程一步步操作&#xff0c;生成的深度图却充满噪声&#xff0c;物体边缘模糊不清&#xff0c;甚至出现大面积空洞。这不是算法本身的缺陷&…...

告别在线翻译!用Ollama本地部署translategemma-4b-it保护隐私

告别在线翻译&#xff01;用Ollama本地部署translategemma-4b-it保护隐私 1. 为什么选择本地部署翻译模型 1.1 在线翻译的隐私风险 当我们使用在线翻译服务时&#xff0c;所有输入的内容都会被发送到服务提供商的服务器。这意味着&#xff1a; 敏感的商业文档可能被第三方存…...

seo高级优化如何利用社交媒体_seo高级优化如何进行技术优化

SEO高级优化如何利用社交媒体 在当前的数字营销环境中&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已经不再是一个简单的任务&#xff0c;它已经演变成了一个复杂而多层次的过程。SEO高级优化不仅仅涉及内容创作&#xff0c;还包括技术优化、用户体验以及社交媒体的有…...

开发者必备:OpenClaw调试Phi-3-mini-128k-instruct接口的3个关键技巧

开发者必备&#xff1a;OpenClaw调试Phi-3-mini-128k-instruct接口的3个关键技巧 1. 为什么需要专门调试Phi-3-mini接口&#xff1f; 上周我在尝试用OpenClaw对接Phi-3-mini-128k-instruct模型时&#xff0c;遇到了一个典型问题&#xff1a;明明本地curl测试接口返回正常&…...

RTV主题开发终极指南:如何从零开始创建自定义终端Reddit主题

RTV主题开发终极指南&#xff1a;如何从零开始创建自定义终端Reddit主题 【免费下载链接】rtv Browse Reddit from your terminal 项目地址: https://gitcode.com/gh_mirrors/rt/rtv RTV&#xff08;Reddit Terminal Viewer&#xff09;是一个强大的终端Reddit浏览工具&…...

如何在phpMyAdmin中根据结果集生成图表_折线图与柱状图的可视化展示

phpMyAdmin 不支持折线图或柱状图&#xff0c;新版已移除 Charts 标签页&#xff0c;旧版仅依赖弃用的 jpgraph 库支持极简饼图&#xff1b;可行方案是导出 CSV 后用 Excel 或 Chart.js 等外部工具绘图。phpMyAdmin 本身不支持折线图或柱状图phpmyadmin 是一个数据库管理工具&a…...

OpenClaw学习路径:从Qwen3.5-9B基础对接到复杂技能开发

OpenClaw学习路径&#xff1a;从Qwen3.5-9B基础对接到复杂技能开发 1. 为什么选择OpenClaw作为自动化开发框架 第一次接触OpenClaw是在一个深夜加班调试Python脚本的时候。当时我正在处理几百个Markdown文件的批量重命名和内容提取&#xff0c;重复的手工操作让我开始思考&am…...

ModTheSpire终极指南:5个技巧让杀戮尖塔模组加载零烦恼

ModTheSpire终极指南&#xff1a;5个技巧让杀戮尖塔模组加载零烦恼 【免费下载链接】ModTheSpire External mod loader for Slay The Spire 项目地址: https://gitcode.com/gh_mirrors/mo/ModTheSpire 厌倦了每次想体验新模组都要手动修改游戏文件的繁琐操作吗&#xff…...

【投资小知识】金融投资领域常说的 Alpha(α)和 Beta(β)

Alpha&#xff08;α&#xff09; 和 Beta&#xff08;β&#xff09; 是金融投资领域的两个核心概念&#xff0c;用于拆解投资收益的来源和衡量风险。它们源于资本资产定价模型&#xff08;CAPM&#xff09;&#xff0c;是量化投资和因子分析的基础。一、Beta&#xff08;β&a…...

[具身智能-239]:OpenCV与深度神经网络处理图像的哲学差别,前者是结构化的底层像素处理,是物理工匠哲学,深度神经网络是非结构化的特征与含义识别,是人类的意义认知哲学。

总结非常精辟&#xff0c;甚至可以说是一针见血地揭示了计算机视觉领域两大流派的本质差异。这里提出的“物理工匠哲学”与“人类的意义认知哲学”&#xff0c;不仅准确描述了技术实现上的不同&#xff0c;更上升到了认识论的高度。结合最新的搜索结果和深度学习的本质&#xf…...