堆排序算法详解:原理与Python实现


在这里插入图片描述
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
在这里插入图片描述

  • 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~

  • 专栏导航

    • Python系列: Python面试题合集,剑指大厂
    • Git系列: Git操作技巧
    • GO系列: 记录博主学习GO语言的笔记,该笔记专栏尽量写的试用所有入门GO语言的初学者
    • 数据库系列: 详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 运维系列: 总结好用的命令,高效开发
    • 算法与数据结构系列: 总结数据结构和算法,不同类型针对性训练,提升编程思维

    非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

    💖The Start💖点点关注,收藏不迷路💖

    📒文章目录

        • 堆排序的步骤
        • 代码实现
        • 详细说明
        • 时间复杂度和空间复杂度
        • 应用场景
        • 总结


堆排序(Heap Sort)是一种基于堆数据结构的比较排序算法。堆是一种特殊的完全二叉树结构,分为最大堆和最小堆。最大堆的特点是每个节点的值都大于或等于其子节点的值,最小堆则相反。

堆排序的基本思想是将数组构造成一个堆,然后利用堆的特性不断调整堆结构,将最大(或最小)值移到数组的末尾,从而实现排序。

堆排序的步骤

  1. 构建最大堆:将未排序的数组构造成最大堆。
  2. 交换堆顶元素和末尾元素:将最大堆的堆顶元素(即最大值)与末尾元素交换,然后将堆的大小减1。
  3. 调整堆:调整堆结构使其再次成为最大堆。
  4. 重复步骤2和步骤3,直到堆的大小为1。

代码实现

以下是堆排序的Python实现:

def heapify(arr, n, i):"""将以i为根的子树调整为最大堆:param arr: 数组:param n: 堆的大小:param i: 根节点索引"""largest = i  # 初始化最大值节点为根节点left = 2 * i + 1  # 左子节点right = 2 * i + 2  # 右子节点# 如果左子节点存在且大于根节点,则更新最大值节点if left < n and arr[left] > arr[largest]:largest = left# 如果右子节点存在且大于根节点,则更新最大值节点if right < n and arr[right] > arr[largest]:largest = right# 如果最大值不是根节点,则交换并继续调整堆if largest != i:arr[i], arr[largest] = arr[largest], arr[i]heapify(arr, n, largest)def heapSort(arr):n = len(arr)# 构建最大堆for i in range(n // 2 - 1, -1, -1):heapify(arr, n, i)# 一个个取出元素for i in range(n - 1, 0, -1):arr[i], arr[0] = arr[0], arr[i]  # 交换heapify(arr, i, 0)# 测试
arr = [12, 11, 13, 5, 6, 7]
heapSort(arr)
print("排序后的数组:", arr)

详细说明

  1. heapify函数:用于调整以索引i为根的子树,使其满足最大堆的性质。通过比较根节点和左右子节点的大小,找出最大值节点,并进行必要的交换。递归地调整交换后的子树。

  2. heapSort函数

    • 构建最大堆:从最后一个非叶子节点开始,逐步向上调整每个子树,使整个数组成为一个最大堆。
    • 排序:逐个将堆顶(最大值)元素与末尾元素交换,并缩小堆的大小,然后调整堆以保持最大堆性质。

时间复杂度和空间复杂度

  • 时间复杂度:堆排序的时间复杂度为O(n log n),因为构建堆的时间复杂度为O(n),调整堆的时间复杂度为O(log n),在最坏情况下需要进行n次调整。
  • 空间复杂度:堆排序是原地排序算法,空间复杂度为O(1)。

应用场景

堆排序适用于需要稳定时间复杂度且对空间复杂度要求较高的应用场景。虽然堆排序的最坏情况下时间复杂度与快速排序相同,但其在实际应用中可能不如快速排序高效。

总结

堆排序是一种高效的比较排序算法,通过利用堆数据结构的特性,能够在O(n log n)的时间内完成排序。理解堆排序的基本思想和实现步骤,对于深入学习排序算法和数据结构具有重要意义。


🔥🔥🔥道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

💖The End💖点点关注,收藏不迷路💖

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

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

相关文章

后端回写前端日期格式化

问题 不进行格式化处理&#xff0c;就会导致传递的字符串很奇怪 解决方案 注解&#xff08;字段&#xff09; <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.2</…

【unity进阶知识1】最详细的单例模式的设计和应用,继承和不继承MonoBehaviour的单例模式,及泛型单例基类的编写

文章目录 前言一、不使用单例二、普通单例模式1、单例模式介绍实现步骤&#xff1a;单例模式分为饿汉式和懒汉式两种。 2、不继承MonoBehaviour的单例模式2.1、基本实现2.2、防止外部实例化对象2.3、最终代码 3、继承MonoBehaviour的单例模式3.1、基本实现3.2、自动创建和挂载单…

java jdk8内存序列化为xml

在Java JDK 8中&#xff0c;将对象内存序列化为XML格式&#xff0c;可以使用JAXB&#xff08;Java Architecture for XML Binding&#xff09;&#xff0c;它是JDK 8的一部分&#xff0c;并且被广泛用于Java对象与XML之间的转换。以下是一个使用JAXB在JDK 8中将Java对象序列化为…

QT窗口无法激活弹出问题排查记录

问题背景 问题环境 操作系统: 银河麒麟V10SP1qt版本 : 5.12.12 碰见了一个问题应用最小化,然后激活程序窗口无法弹出 这里描述一下代码的逻辑,使用QLocalServer实现一个单例进程,具体的功能就是在已存在一个程序A进程时,再启动这个程序A,新的程序A进程会被杀死,然后激活已存…

PSS-sdy_opengl_sdd

PSS-sdy_opengl_sdd是一个基于商用工具SCADE Display&#xff08;OpenGL&#xff09;的二次开发项目。 该项目构建的工具可用于生成SCADE Display&#xff08;OpenGL&#xff09;软件模型的软件设计文档。其设计思想详见&#xff1a; SCADE Display&#xff08;OpenGL&#xf…

linux信号| 学习信号三步走 | 学习信号需要打通哪些知识脉络?

前言: 本节内容主要讲解linux下信号的预备知识以及信号的概念&#xff0c; 信号部分我们将会分为几个阶段进行讲解&#xff1a;信号的概念&#xff0c; 信号的产生&#xff0c; 信号的保存。本节主要讲解信号 ps:本节内容适合学习了进程相关概念的友友们进行观看哦 目录 什么是…

电脑上数据丢了怎么找回来 Win系统误删文件如何恢复

无论是在工作中&#xff0c;还是生活中&#xff0c;电脑都是不可缺少的重要工具&#xff0c;尤其是在工作中&#xff0c;电脑不仅可以高效的完成工作&#xff0c;还可以存储工作中的重要资料。不过在使用电脑的时候&#xff0c;也会遇到数据丢失的情况。针对这一问题&#xff0…

CPLD 工程师面试题

CPLD(复杂可编程逻辑器件)工程师面试题通常会围绕CPLD的基本概念、特性、应用、设计流程以及相关的硬件设计知识等方面展开。 一、基础概念与特性 什么是CPLD? CPLD是复杂可编程逻辑器件(Complex Programmable Logic Device)的缩写,它结合了PAL(可编程阵列逻辑)和FPGA…

vue3 + ts + cesium:绘制、拖动点 point

本文主要实现最基础的绘制点&#xff0c;并且可以拖动刚刚绘制的点。 实现效果&#xff1a; &#xff08;1&#xff09;单击鼠标左键绘制点&#xff1b; &#xff08;2&#xff09;单击鼠标右键结束绘制&#xff1b; &#xff08;3&#xff09;长按鼠标左键拖动点&#xff0c;…

水面巡检船垃圾漂浮物检测系统源码分享

水面巡检船垃圾漂浮物检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of …

在GPU计算型实例中安装Tesla驱动超详细过程

摘要&#xff1a;在深度学习、AI等通用计算业务场景或者OpenGL、Direct3D、云游戏等图形加速场景下&#xff0c;安装了Tesla驱动的GPU才可以发挥高性能计算能力&#xff0c;或提供更流畅的图形显示效果。如果您在创建GPU计算型实例&#xff08;Linux&#xff09;时未同时安装Te…

Linux服务器安装Anaconda环境

Linux浪潮云服务器安装Anaconda环境 读研之后在导师的帮助下&#xff0c;获得了浪潮的一台公共云服务器。以后做实验跑代码就可以使用云服务器上的虚拟环境了。减少了自己笔记本的压力。在创建并保存完成镜像环境之后。最重要的就是安装好深度学习需要的Anaconda环境&#xff0…

“类型名称”在Go语言规范中的演变

Go语言规范&#xff08;The Go Programming Language Specification&#xff09;[1]是Go语言的核心文档&#xff0c;定义了该语言的语法、类型系统和运行时行为。Go语言规范的存在使得开发者在实现Go编译器时可以依赖一致的标准&#xff0c;它确保了语言的稳定性和一致性&#…

linux ip命令使用

大家好&#xff0c;这里是大数据那点事儿&#xff0c;专注于大数据处理、高性能计算&#xff0c;平时也会分享干货、生活点滴感悟&#xff01; <section class"mp_profile_iframe_wrp"><mp-common-profile class"custom_select_card mp_profile_ifram…

python -tkinter

在Button的command绑定中&#xff0c;如果给的一个函数&#xff0c;则表示执行一次。 import tkinter as Tkfrom tkinter import messageboxi 0def myLabel():global root,is Tk.Label(root,text"the import thing is :" )s.pack()root Tk.Tk()def fun1():if mess…

[PICO VR眼镜]眼动追踪串流Unity开发与使用方法,眼动追踪打包报错问题解决(Eye Tracking/手势跟踪)

前言 最近在做一个工作需要用到PICO4 Enterprise VR头盔里的眼动追踪功能&#xff0c;但是遇到了如下问题&#xff1a; 在Unity里面没法串流调试眼动追踪功能&#xff0c;根本获取不到Device&#xff0c;只能将整个场景build成APK&#xff0c;安装到头盔里&#xff0c;才能在…

【Python语言初识(五)】

一、文件和异常 在Python中实现文件的读写操作其实非常简单&#xff0c;通过Python内置的open函数&#xff0c;我们可以指定文件名、操作模式、编码信息等来获得操作文件的对象&#xff0c;接下来就可以对文件进行读写操作了。这里所说的操作模式是指要打开什么样的文件&#…

泛型(Java)

1.泛型&#xff1a; 将数据类型作为参数进行传递。(传递的数据类型必须是引用数据类型) 本质是参数化类型。 泛型集合&#xff1a;可以约束集合内的元素类型 典型泛型集合ArrayList<E>、HashMap<K,V> <E>、<K,V>表示该泛型集合中的元素类型泛型集合中的…

计算机视觉学习路线

计算机视觉&#xff08;Computer Vision&#xff09;是计算机科学的一个重要分支&#xff0c;旨在使计算机能够理解和解释视觉数据。以下是一个详细的计算机视觉学习路线&#xff0c;帮你系统地掌握这个领域所需的知识和技能。 1. 基础数学和编程 在深入学习计算机视觉之前&…

数据结构之——单循环链表和双向循环链表

一、单循环链表的奥秘 单循环链表是一种特殊的链表结构&#xff0c;它在数据结构领域中具有重要的地位。其独特的循环特性使得它在某些特定的应用场景中表现出强大的优势。 &#xff08;一&#xff09;结构与初始化 单循环链表的结构由节点组成&#xff0c;每个节点包含数据域…