【java实现+4种变体完整例子】排序算法中【堆排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格

以下是堆排序的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格:
在这里插入图片描述


一、堆排序基础实现

原理

基于二叉堆结构(最大堆),通过以下步骤实现排序:

  1. 构建最大堆:将数组调整为一个最大堆,根节点为最大值。
  2. 提取最大值:将堆顶元素(最大值)与末尾元素交换,缩小堆范围,重新调整堆。
  3. 重复步骤2:直到堆为空。
代码示例
public class HeapSort {void sort(int[] arr) {int n = arr.length;// Build max heapfor (int i = n / 2 - 1; i >= 0; i--) {heapify(arr, n, i);}// Extract elements one by onefor (int i = n - 1; i >= 0; i--) {// Move current root to endint temp = arr[0];arr[0] = arr[i];arr[i] = temp;// Heapify the reduced heapheapify(arr, i, 0);}}// Recursive heapify to build a max heapprivate void heapify(int[] arr, int n, int i) {int largest = i; // Initialize largest as rootint left = 2 * i + 1;int right = 2 * i + 2;// If left child is larger than rootif (left < n && arr[left] > arr[largest]) {largest = left;}// If right child is larger than largest so farif (right < n && arr[right] > arr[largest]) {largest = right;}// If largest is not rootif (largest != i) {int swap = arr[i];arr[i] = arr[largest];arr[largest] = swap;// Recursively heapify the affected sub-treeheapify(arr, n, largest);}}
}
复杂度分析
  • 时间复杂度O(n log n)(所有情况)。
  • 空间复杂度O(log n)(递归调用栈空间)。
  • 稳定性:不稳定(相同值的元素可能因交换顺序改变相对位置)。

二、常见变体及代码示例

1. 迭代实现(非递归)

改进点:用循环替代递归,减少栈空间开销。
适用场景:避免递归深度限制或优化性能。

public class IterativeHeapSort {void sort(int[] arr) {int n = arr.length;// Build max heapfor (int i = n / 2 - 1; i >= 0; i--) {iterativeHeapify(arr, n, i);}// Extract elements one by onefor (int i = n - 1; i >= 0; i--) {int temp = arr[0];arr[0] = arr[i];arr[i] = temp;iterativeHeapify(arr, i, 0);}}// Iterative heapify to build a max heapprivate void iterativeHeapify(int[] arr, int n, int i) {int largest = i;int left = 2 * i + 1;int right = 2 * i + 2;while (true) {if (left < n && arr[left] > arr[largest]) {largest = left;}if (right < n && arr[right] > arr[largest]) {largest = right;}if (largest == i) break;// Swap and continueint swap = arr[i];arr[i] = arr[largest];arr[largest] = swap;i = largest;left = 2 * i + 1;right = 2 * i + 2;}}
}
2. 最小堆实现

改进点:使用最小堆实现排序,需反转结果。
适用场景:需用最小堆结构的场景(如优先队列)。

public class MinHeapSort {void sort(int[] arr) {int n = arr.length;// Build min heapfor (int i = n / 2 - 1; i >= 0; i--) {heapify(arr, n, i);}// Extract elements one by one (ascending order requires reversal)for (int i = n - 1; i >= 0; i--) {int temp = arr[0];arr[0] = arr[i];arr[i] = temp;heapify(arr, i, 0);}reverse(arr); // Reverse to get ascending order}// Heapify for min heapprivate void heapify(int[] arr, int n, int i) {int smallest = i;int left = 2 * i + 1;int right = 2 * i + 2;if (left < n && arr[left] < arr[smallest]) {smallest = left;}if (right < n && arr[right] < arr[smallest]) {smallest = right;}if (smallest != i) {swap(arr, i, smallest);heapify(arr, n, smallest);}}private void reverse(int[] arr) {int left = 0, right = arr.length - 1;while (left < right) {swap(arr, left, right);left++;right--;}}private void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}
}
3. 原地堆排序优化

改进点:减少比较次数,优化堆调整过程。
适用场景:追求极致性能的场景。

public class OptimizedHeapSort {void sort(int[] arr) {int n = arr.length;// Build max heap with reduced comparisonsfor (int i = n / 2 - 1; i >= 0; i--) {heapify(arr, n, i);}// Extract elements one by onefor (int i = n - 1; i >= 0; i--) {swap(arr, 0, i);heapify(arr, i, 0);}}// Optimized heapify to reduce comparisonsprivate void heapify(int[] arr, int n, int i) {while (true) {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) break;swap(arr, i, largest);i = largest;}}private void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}
}

三、变体对比表格

变体名称时间复杂度空间复杂度稳定性主要特点适用场景
基础堆排序(递归)O(n log n)O(log n)不稳定递归实现,简单直观通用排序,需避免栈溢出时需迭代版
迭代堆排序O(n log n)O(1)不稳定无递归,减少栈空间开销需避免递归深度限制的场景
最小堆实现O(n log n)O(1)不稳定使用最小堆并反转结果,适合特定需求需最小堆结构或特殊排序需求
原地优化堆排序O(n log n)O(1)不稳定减少比较次数,提升性能高性能要求场景

四、关键选择原则

  1. 基础场景:优先使用基础递归实现,因其简单易懂。
  2. 栈限制场景:迭代实现适合避免递归深度限制(如超大数组)。
  3. 最小堆需求:最小堆变体适用于需要最小堆结构的场景,但需额外反转步骤。
  4. 性能优化:原地优化版通过减少比较次数提升效率,适合对性能敏感的场景。
  5. 稳定性需求:所有变体均不稳定,若需稳定排序需选择其他算法(如归并排序)。

通过选择合适的变体,可在特定场景下优化性能或适应硬件限制。例如,迭代实现避免栈溢出,而原地优化版通过减少比较次数提升效率。

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

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

相关文章

论文阅读笔记:Generative Modeling by Estimating Gradients of the Data Distribution

1、参考来源 论文《Generative Modeling by Estimating Gradients of the Data Distribution》 来源&#xff1a;NeurIPS 2019 论文链接&#xff1a;https://arxiv.org/abs/1907.05600 参考链接&#xff1a; 【AI知识分享】真正搞懂扩散模型Score Matching一定要理解的三大核心…

Kubernetes相关的名词解释CNI插件(1)

&#xff08;一&#xff09;什么是CNI插件&#xff1f; 在 Kubernetes 中&#xff0c;CNI 插件&#xff08;Container Network Interface Plugin&#xff09; 是一种用于配置容器网络接口的标准工具&#xff0c;负责为 Pod 分配网络资源&#xff08;如 IP 地址&#xff09;并建…

2021-11-10 C++蜗牛爬井进3退1求天数

缘由C大一编程题目。-编程语言-CSDN问答 int n 0, t 0;cin >> n;while ((n - 3)>0)n, t;cout << t << endl;

分享一个DeepSeek+自建知识库实现人工智能,智能回答高级用法。

这个是我自己搞的DeepSeek大模型自建知识库相结合到一起实现了更强大的回答问题能力还有智能资源推荐等功能。如果感兴趣的小伙伴可以联系进行聊聊&#xff0c;这个成品已经有了实现了&#xff0c;所以可以融入到你的项目&#xff0c;或者毕设什么的还可以去参加比赛等等。 1.项…

动态规划算法:状态压缩

状态压缩动态规划算法 状态压缩动态规划是动态规划的一种&#xff0c;它通过使用位运算的方式压缩程序占用的空间&#xff0c;对于可以用来解决一些只有两个状态&#xff08;是与否&#xff09;的问题。 多少无益&#xff0c;我们通过下面的一道编程题目来学习这种算法。 题目…

查看matlab函数帮助文档的方法

方法一&#xff1a;在命令行窗口中使用help命令 方法二&#xff1a;在命令行窗口中使用doc命令 方法三&#xff1a;在帮助文档中搜索关键字

MYSQL初阶(暂为自用草稿)

目录 基本操作 database操作 table操作 数据类型 INT类型 bit类型 FLOAT类型 CHAR类型 DATE类型 SEL类型 表的约束 列约束 NULL DEFAULT PRIMARY KEY UNIQUE KEY 表约束 PRIMARY KEY FOREIGN KEY 其他补充 AUTO_INCREMENT COMMENT ZEROFILL 表的CRUD …

MVC/MVVM 高级应用的深度解析

状态共享与同步 跨组件状态管理策略 状态变更的传播机制优化 状态快照与时间旅行调试 状态持久化 本地存储策略 状态序列化与反序列化 与服务端状态同步 数据绑定进阶 双向绑定优化 脏检查机制优化 基于Proxy/Object.defineProperty的实现差异 批量更新策略 自定义…

AI 边缘计算盒子:开启智能物联新时代

一、什么是 AI 边缘计算盒子 AI 边缘计算盒子是一种集成了高性能芯片、AI 算法和数据处理能力的硬件设备。它部署在数据源的边缘侧&#xff0c;如工厂、商场、交通路口等&#xff0c;能够在本地进行数据采集、预处理、分析和决策&#xff0c;而无需将所有数据上传到云端。这种…

LeetCode 5:最长回文子串

1、题目描述 给你一个字符串 s&#xff0c;找到 s 中最长的 回文 子串。 示例 1: 输入&#xff1a;s "babad" 输出&#xff1a;"bab" 解释&#xff1a;"aba" 同样是符合题意的答案。 示例 2: 输入&#xff1a;s "cbbd" 输出&#…

简易 Python 爬虫实现,10min可完成带效果源码

目录 准备工作 编写爬虫代码 运行爬虫 查看结果 遇到的问题及解决 总结 前言和效果 本文记录了使用 Python 实现一个简单网页爬虫的过程&#xff0c;目标是爬取 quotes.toscrape.com 的名言和作者&#xff0c;并将结果保存到文本文件。以下是完整步骤&#xff0c;包含环境…

【KWDB 创作者计划】_上位机知识篇---Docker容器

文章目录 前言1. Docker 容器是什么&#xff1f;隔离性轻量级可移植性可复用性 2. Docker 核心概念镜像容器仓库Dockerfile 3. Docker 基本使用(1) 安装 Docker(2) 容器生命周期管理(3) 镜像管理(4) 进入容器内部(5) 数据持久化&#xff08;挂载卷&#xff09;(6) 网络管理 4. …

树莓派练习

1.守护进程 守护进程含义&#xff1a;守护进程在树莓派上电后开始运行&#xff0c;断电后结束运行的进程&#xff0c;即使你的终端退出也不会停止&#xff0c;我们可以手动关闭它 使用nohup创建守护进程 先创建一个c语言文件&#xff08;long_task.c&#xff09; #include …

详细解释浏览器是如何渲染页面的?

渲染流程概述 渲染的目标&#xff1a;将HTML文本转化为可以看到的像素点 当浏览器的网络线程收到 HTML 文档后&#xff0c;会产生一个渲染任务&#xff0c;并将其传递给渲染主线程的消息队列。在事件循环机制的作用下&#xff0c;渲染主线程取出消息队列中的渲染任务&#xff0…

java+postgresql+swagger-多表关联insert操作(九)

入参为json&#xff0c;然后根据需要对多张表进行操作&#xff1a; 入参格式&#xff1a; {"username": "车主01","usertel": "11111111111","useridtype": "2","useridcard": null,"proname&qu…

JavaSpring 中使用 Redis

创建项目 配置 Redis 服务地址 创建 Controller 类 由于当前只是些简单的测试代码&#xff0c;所以就不进行分层了&#xff0c;只创建一个 Controller 来实现 jedis 通过 jedis 对象里的各种方法来操作 Redis 此处通过 StringRedisTemplate 来操作 Redis 最原始提供的类是 Re…

AI文生图工具推荐

一、AI文生图技术实现原理 AI文生图&#xff08;Text-to-Image&#xff09;基于生成对抗网络&#xff08;GAN&#xff09;或扩散模型&#xff08;Diffusion Model&#xff09;实现&#xff0c;通过深度学习将文本描述转化为图像。其核心流程包括&#xff1a; 文本编码&#xf…

数据结构——快排和归并排序(非递归)

快速排序和归并排序一般都是用递归来实现的&#xff0c;但是掌握非递归也是很重要的&#xff0c;说不定在面试的时候面试官突然问你快排或者归并非递归实现&#xff0c;递归有时候并不好&#xff0c;在数据量非常大的时候效率就不好&#xff0c;但是使用非递归结果就不一样了&a…

【笔记】网络安全管理

计算机硬件中,运算器和控制器通常集成在一块芯片内,一般称为()。 数据库DB、数据库系统DBS、数据库管理系统DBMS,三者之间的关系是()。 OSI/RM体系结构中的网络层与TCP/IP体系结构中的()功能相同。 三级系统应按照等保2.0要求采用密码技术通信过程中数据的()。 …

.net core web api 数据验证(DataAnnotations)

目录 一、什么是 DataAnnotations&#xff1f; 二、扩展验证逻辑&#xff08;自定义验证器&#xff09; 一、什么是 DataAnnotations&#xff1f; DataAnnotations 是一组特性&#xff08;Attributes&#xff09;&#xff0c;用于在模型类上定义验证规则。主要用于属性级别的…