[排序算法]堆排序

目录

1.基本思想

2.堆排序的步骤

3.堆排序算法的实现

4.堆排序的特点:

5.总结


1.基本思想

堆排序(Heap Sort)的基本思想是利用堆这种数据结构进行排序。堆是一个完全二叉树,分为最大堆(Max Heap)和最小堆(Min Heap)两种类型。

  1. 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;
  2. 小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;

2.堆排序的步骤

堆排序的基本步骤:

  1. 建堆(Heapify):

    • 将待排序数组看作是一个完全二叉树,并构建一个最大堆(Max Heap)或最小堆(Min Heap)。
    • 从最后一个非叶子节点开始,依次向前调整节点,使得每个节点都满足堆的性质(父节点的值大于/小于子节点的值)。
  2. 排序:

    • 从堆顶(根节点)取出最大(最小)元素,与堆的最后一个元素交换位置。
    • 然后对剩余的堆进行调整,使其重新满足堆的性质。
    • 不断重复上述步骤,直到整个数组有序。

3.堆排序算法的实现

Java 实现堆排序的示例代码:

public class HeapSort {public static void heapSort(int[] arr) {int n = arr.length;// Build heap (rearrange array)for (int i = n / 2 - 1; i >= 0; i--) {heapify(arr, n, i);}// One by one extract an element from heapfor (int i = n - 1; i > 0; i--) {// Move current root to endint temp = arr[0];arr[0] = arr[i];arr[i] = temp;// call max heapify on the reduced heapheapify(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 temp = arr[i];arr[i] = arr[largest];arr[largest] = temp;heapify(arr, n, largest);}}public static void main(String[] args) {int[] arr = {12, 11, 13, 5, 6, 7};System.out.println("Original Array: " + Arrays.toString(arr));heapSort(arr);System.out.println("Sorted Array: " + Arrays.toString(arr));}
}

在上面的示例中,heapSort 方法用于执行堆排序,heapify 方法用于维护堆的性质。

4.堆排序的特点:

  • 时间复杂度: 堆排序的时间复杂度为 O(n*log(n)),其中 n 是数组的长度。这是因为建堆的时间复杂度为 O(n),每次调整堆的时间复杂度为 O(log(n)),共需要调整 n-1 次。
  • 空间复杂度: 堆排序是原地排序算法,只需要常数级别的额外空间。
  • 稳定性: 堆排序是一种不稳定的排序算法,因为在调整堆的过程中可能会改变相同元素的顺序

5.总结

堆排序是一种高效的排序算法,尤其适用于需要稳定时间复杂度的情况下。它不需要额外的空间,是原地排序算法,适用于大规模数据的排序。

PS:如有错漏之处,敬请指正

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

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

相关文章

【前端】HTML基础(3)

文章目录 前言一、HTML基础1、表格标签1.1 基本使用1.2 合并单元格 2、列表标签2.1 无序列表2.2 有序列表2.3 自定义列表 3、 表单标签2.1 form标签2.2 input标签2.3 label标签2.4 select标签2.5 textarea标签 4、无语义标签5、HTML特殊字符 前言 这篇博客仅仅是对HTML的基本结…

微服务领域的寻路者 —— Eureka深度探索与实战秘籍

文章目录 一、引言定义目标一个接地气的例子引言小结 二、Eureka架构2.1 Eureka Server一个有趣的例子2.2 Eureka Client一段简单的代码示例架构小结 三、工作流程1. 服务注册2. 心跳检测3. 服务发现4. 健康检查与失效剔除工作流程小结 四、核心机制4.1 服务注册与续约4.2 服务…

⭐⭐⭐宁波ISO9001认证:追求卓越的选择⭐⭐⭐

&#x1f308;&#x1f308;宁波ISO9001认证&#xff1a;&#x1f353;追求卓越的选择&#x1f680; &#x1f432;在追逐卓越的道路上&#xff0c;&#x1f98b;每一家企业都在寻找&#x1f426;那个能让自己腾飞&#x1f99c;的翅膀。而对我来说&#xff0c;&#x1f9a9;那个…

高精度乘法C++

1.高精度乘高精度的简单算法 思想&#xff1a;倒置相乘&#xff0c;统一处理进位&#xff0c;还原。 复杂度&#xff1a; o ( n 2 ) o(n^2) o(n2) // By SnowDream #include<bits/stdc.h> using namespace std; typedef long long ll; const int N1e510; string s1,s2…

【设计模式】单例模式的前世今生

文章目录 引言简介起航&#xff01;向“确保某个类在系统中只有一个实例”进发 ⛵️Lazy SingletonDouble-checked locking&#xff08;DCL&#xff09; SingletonVolatile SingletonAtomic SingletonMeyers Singleton 附&#xff1a;C静态对象的初始化 引言 说起单例模式&…

华为OD机试 - 分月饼 - 递归(Java 2024 C卷 200分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

apache基于IP和端口的虚拟主机

基于IP虚拟机主机 vim /etc/httpd/conf/httpd.conf添加监听IP Listen 192.168.0.1:80 Listen 192.168.0.10:80添加虚拟主机和发布目录 第一台虚拟主机 <VirtualHost 192.168.0.1:80>ServerAdmin www.123.comDocumentRoot /webroot/192.168.0.1ErrorLog logs/192.168.…

Splay 树简介

【Splay 树简介】 ● Treap 树解决平衡的办法是给每个结点加上一个随机的优先级&#xff0c;实现概率上的平衡。Splay 树直接用旋转调整树的形态&#xff0c;通过旋转改善树的平衡性。计算量小&#xff0c;效果好。 ● Splay 树的旋转主要分为“单旋”和“双旋”。 所谓“单旋”…

代码审计之浅谈RASP技术

前言&#xff1a; 想摆会烂&#xff0c;所以就落个笔吧。 其实本来是想写关于iast技术的&#xff0c;但是认真思考了下&#xff0c;感觉笔者自己本身也不太能讲清楚iast技术&#xff0c;怕误人子弟。 所以最后还是基于笔者的理解以及实际应用写一篇关于RASP技术的文章&#xf…

强化学习:时序差分法【Temporal Difference Methods】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程&#xff0c;个人觉得赵老师的课件深入浅出&#xff0c;很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 第四章 值迭代和策略迭代 第五章 强化学习实例分析:GridWorld…

软件游戏丢失XINPUT1_4.dll文件的多种解决方法分享

当玩家在尝试启动某款游戏时&#xff0c;遇到了系统提示“游戏找不到XINPUT1_4.dll”&#xff0c;这个错误通常发生在玩家尝试启动游戏时&#xff0c;游戏无法找到所需的XINPUT1_4.dll文件&#xff0c;呆滞无法正常启动运行。但是幸运的是&#xff0c;有一些简单的修复方法可以…

自制AI:Park_01修改bug

修改了一下不能存东西&#xff0c;不能打开东西的bug #include<bits/stdc.h> #include<windows.h> using namespace std; double mem10737418240; map<string,string> jishiben; string mulu"朴同学给你的一封信.memo\n"; int cntnote1; void sta…

软件测试与管理:黑盒测试-因果图法和场景法

知识思维导图&#xff1a; ​​​​​​​ 例题1&#xff1a;运用因果图法设计测试用例 有一个处理单价为5角钱的饮料的自动售货机软件测试用例的设计。其规格说明如下&#xff1a; 若投入5角钱或1元钱的硬币&#xff0c;按下〖橙汁〗或〖啤酒〗的按钮&#xff0c;则相应的饮料…

代码随想录算法训练营第四十六天|LeetCode139.完全平方数

LeetCode 139 完全平方数 题目链接&#xff1a;139. 单词拆分 - 力扣&#xff08;LeetCode&#xff09; 【解题思路】 1.确定dp数组以及下标含义 dp[j]的定义是&#xff1a; 字符串长度为i的话&#xff0c;dp[i]为true&#xff0c;表示可以拆分为一个或多个在字典中出现的单词…

[方法] Unity 实现仿《原神》第三人称跟随相机 v1.1

参考网址&#xff1a;【Unity中文课堂】RPG战斗系统Plus 在Unity游戏引擎中&#xff0c;实现类似《原神》的第三人称跟随相机并非易事&#xff0c;但幸运的是&#xff0c;Unity为我们提供了强大的工具集&#xff0c;其中Cinemachine插件便是实现这一目标的重要工具。Cinemachi…

4步快速配置Java和MySQL环境

每次入职一家新公司或者用一台其他的临时电脑或者新电脑时都要重新配置Java开发环境&#xff0c;很麻烦&#xff0c;因此我在这里记录一下快速配置环境的方式&#xff0c;四步搞定&#xff01;此处以win为操作系统进行讲解。 第一步&#xff1a;下载链接 下载链接&#xff1a…

二叉树1:二叉树的基本运算

1. (简答题) 编写一个程序&#xff0c;实现二叉树的基本运算&#xff0c;具体要求如下&#xff1a;&#xff08;指定示范实例1&#xff1a;P243图7.34。指定示范实例2&#xff1a;P201图7.13 &#xff09; 1&#xff0c;括号表示法输出该树。 2&#xff0c;输入一个结点的值&…

04.1.添加多个监控同步其他主机

添加多个监控&同步其他主机 1.首先在agent配置文件中存在Include的&#xff0c;也就是说明&#xff0c;可以配置多个监控项并且同步到其他主机上的进行使用&#xff1b; 2.主机之间互相推送配置文件即可&#xff1b; 开始测试 我这里实在agent节点上直接在路径/etc/zabbi…

Go实现树莓派控制舵机

公式说明 毫秒&#xff08;ms&#xff09;是时间的单位&#xff0c;赫兹&#xff08;Hz&#xff09;是频率的单位&#xff0c;而DutyMax通常是一个PWM&#xff08;脉冲宽度调制&#xff09;信号中表示最大占空比的值。以下是它们之间的关系和一些相关公式&#xff1a; 频率&…

Python内置函数min()详解

Python中的min()函数是一个内置函数&#xff0c;用于找出给定参数或可迭代对象中的最小值。 函数定义 min()函数可以有两种不同的使用方式&#xff1a; min(iterable, *[, defaultobj, keyfunc]) min(arg1, arg2, *args[, keyfunc])iterable&#xff1a;一个可迭代对象。def…