Python 算法高级篇:堆排序的优化与应用

Python 算法高级篇:堆排序的优化与应用

  • 引言
  • 1. 什么是堆?
  • 2. 堆的性质
  • 3. 堆排序的基本原理
  • 4. 堆排序的 Python 实现
  • 5. 堆排序的性能和优化
  • 6. 堆排序的实际应用
  • 7. 总结

引言

堆排序是一种高效的排序算法,它基于数据结构中的堆这一概念。堆排序的时间复杂度为 O ( n log n ),这使得它在处理大规模数据时非常有用。本文将深入讨论堆排序的原理、堆的概念、堆排序的 Python 实现,以及一些堆排序的优化和实际应用。

😃😄 ❤️ ❤️ ❤️

1. 什么是堆?

在计算机科学中,堆是一种特殊的树形数据结构,它满足以下两个性质:

  • 堆的每个节点都有一个值。
  • 堆中每个节点的值都必须大于等于或小于等于其子节点的值,具体取决于堆是大顶堆还是小顶堆。

大顶堆的根节点的值最大,小顶堆的根节点的值最小。

堆通常用数组来实现,其中根节点存储在索引 0 处。对于大顶堆,父节点的值大于或等于其子节点的值,对于小顶堆,父节点的值小于或等于其子节点的值。

2. 堆的性质

堆有两个主要性质:

  • 堆是一棵完全二叉树,这意味着堆中的节点从左到右填充,没有“空洞”。
  • 堆中每个节点的值都满足堆性质,即大顶堆或小顶堆性质。

这些性质使得堆非常适合实现堆排序算法。

3. 堆排序的基本原理

堆排序是一种基于比较的排序算法,其基本原理可以概括为以下几个步骤:

  • 1 . 构建一个初始堆:将待排序的数据构建成一个堆结构。这一步通常涉及将数组转换为一个堆,需要从最后一个非叶子节点开始,从右到左,逐个将它们“下沉”到合适的位置,以满足堆的性质。

  • 2 . 堆排序:从堆中不断移除根节点,并将其放置在已排序的部分。重复此过程,直到堆为空。

  • 3 . 结果:排序完成后,数组中的数据已按升序或降序排列,具体取决于堆是大顶堆还是小顶堆。

4. 堆排序的 Python 实现

下面是堆排序的 Python 实现:

def heapify(arr, n, i):largest = i  # 将根节点看作最大的节点left = 2 * i + 1right = 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 heap_sort(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]
heap_sort(arr)
print("堆排序结果:", arr)

在这个实现中, heapify 函数用于维护堆的性质, heap_sort 函数用于进行堆排序。首先,我们构建一个最大堆,然后一个一个地取出堆的根节点并放在已排序的部分,最终得到排序后的数组。

5. 堆排序的性能和优化

堆排序的时间复杂度是 O ( n log n ),这使得它在大规模数据的排序中表现出色。然而,堆排序不稳定,因为它可能改变相等元素的相对顺序。

堆排序的一个重要优化是使用堆的数据结构来实时处理数据流。在这种情况下,新数据可以不断添加到堆中,并且可以立即获得最大或最小的元素,而不必等待整个数据流结束。

6. 堆排序的实际应用

堆排序的实际应用非常广泛,特别是在需要实时获取最大或最小元素的情况下。以下是一些堆排序的应用场景:

  • 操作系统调度:操作系统可以使用堆排序来确定下一个要执行的进程,根据其优先级来选择。

  • 优先级队列:堆排序可以用于实现优先级队列,其中具有较高优先级的元素首先被处理。

  • 最小(大)的 k 个元素:在一组元素中查找最小或最大的 k 个元素时,堆排序非常有用。

  • 堆排序还用于一些图算法,如最短路径算法和最小生成树算法。

7. 总结

堆排序是一种高效的排序算法,基于堆这一数据结构。它的时间复杂度为 O ( n log n ),使得它在大规模数据的排序中表现出色。堆排序的实现相对简单,但需要理解堆的概念和性质。

在实际应用中,堆排序用于处理需要实时获取最大或最小元素的情况,例如操作系统调度、优先级队列、查找最小(大)的 k 个元素等。此外,堆排序还在图算法中发挥重要作用。

希望通过本文,你对堆排序的原理、实现和应用有更深入的了解。

[ 专栏推荐 ]
😃 Python 算法初阶:入门篇》😄
❤️【简介】:本课程是针对 Python 初学者设计的算法基础入门课程,涵盖算法概念、时间复杂度、空间复杂度等基础知识。通过实例演示线性搜索、二分搜索等算法,并介绍哈希表、深度优先搜索、广度优先搜索等搜索算法。此课程将为学员提供扎实的 Python 编程基础与算法入门,为解决实际问题打下坚实基础。
在这里插入图片描述

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

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

相关文章

C++进阶语法——OOP(面向对象)【学习笔记(四)】

文章目录 1、C OOP⾯向对象开发1.1 类&#xff08;classes&#xff09;和对象&#xff08;objects&#xff09;1.2 public、private、protected访问权限1.3 实现成员⽅法1.4 构造函数&#xff08;constructor&#xff09;和 析构函数&#xff08;destructor&#xff09;1.4.1 构…

Java基础 多线程

1.多线程创建方式1&#xff0c;继承Thread类&#xff1a; 2.多线程创建方式2&#xff1a; 匿名内部类写法 package thread;public class ThreadTest {public static void main(String[] args) {Runnable runnable new Runnable() {Overridepublic void run() {for (int i 0…

笔记本电脑的摄像头找不到黑屏解决办法

这种问题一般来说就是缺少驱动&#xff0c;就要下载驱动。 问题&#xff1a; 解决办法&#xff1a; 1.进入联想官网下载驱动 网站&#xff1a;https://newsupport.lenovo.com.cn/driveDownloads_index.html?v9d9bc7ad5023ef3c3d5e3cf386e2f187 2.下载主机编号检测工具 3.下…

虚幻中的网络概述一

前置&#xff1a;在学习完turbo强大佬的多人fps之后发觉自己在虚幻网络方面还有许多基础知识不太清楚&#xff0c;结合安宁Ken大佬与虚幻官方文档进行补足。 补充&#xff1a;官方文档中的描述挺好的&#xff0c;自己只算是搬运和将两者结合加强理解。 学习虚幻中的网络先从虚…

【Python机器学习】零基础掌握KNNImputer缺失值填充

面临数据不完整怎么办? 在日常生活和工作中,不完整或者缺失的数据是一个很常见的问题。例如,在医疗研究中,由于各种原因,如失访、设备故障等,数据集中可能存在一些缺失值。这些缺失值会影响后续的数据分析和模型训练。 KNNImputer(K-近邻插补)是一个非常实用的工具,…

【Docker】Python Flask + Redis 练习

一、构建flask镜像 1.准备文件 创建app.py,内容如下 from flask import Flask from redis import Redis app Flask(__name__) redis Redis(hostos.environ.get(REDIS_HOST,127.0.0.1),port6379)app.route(/) def hello():redis.incr(hits)return f"Hello Container W…

深度学习中的epoch, batch 和 iteration

名词定义epoch使用训练集的全部数据进行一次完整的训练&#xff0c;称为“一代训练”batch使用训练集中的一小部分样本对模型权重进行一次反向传播的参数更新&#xff0c;这样的一部分样本称为&#xff1a;“一批数据”iteration使用一个batch的数据对模型进行一次参数更新的过…

串行原理编程,中文编程工具中的串行构件,串行连接操作简单

串行通信原理编程&#xff0c;中文编程工具中的串行通信构件&#xff0c;串行通信连接设置简单 编程系统化课程总目录及明细&#xff0c;点击进入了解详情。https://blog.csdn.net/qq_29129627/article/details/134073098?spm1001.2014.3001.5502 串行端口 是串行的基础&#…

【C++】类与对象 第二篇(构造函数,析构函数,拷贝构造,赋值重载)

目录 类的6个默认成员函数 初始化和清理 1.构造函数 2.析构函数 3.共同点 拷贝复制 1.拷贝构造 使用细节 2.赋值重载 运算符重载 < < > > ! 连续赋值 C入门 第一篇(C关键字&#xff0c; 命名空间&#xff0c;C输入&输出)-CSDN博客 C入门 第二篇( 引…

Python学习笔记--类和对象

五、类和对象 1、类和对象之间的关系 这部分内容主要讲类和对象,我们先来说说类和对象之间的关系。 类是对象的模板 我们得先有了类,才能制作出对象。 类就相对于工厂里面的模具,对象就是根据模具制造出来的产品。 从模具变成产品的过程,我们就称为类的实例化。 类实…

POJ 3981:字符串替换 ← C++

【题目来源】http://poj.org/problem?id3981【题目描述】 编写一个C程序实现将字符串中的所有"you"替换成"we"。【输入格式】 输入包含多行数据。 每行数据是一个字符串&#xff0c;长度不超过1000。 数据以EOF结束。【输出格式】 对于输入的每一行&#…

【开源】基于SpringBoot的海南旅游景点推荐系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户端2.2 管理员端 三、系统展示四、核心代码4.1 随机景点推荐4.2 景点评价4.3 协同推荐算法4.4 网站登录4.5 查询景点美食 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的海南旅游推荐系统&#xff…

P1022 [NOIP2000 普及组] 计算器的改良 题解

文章目录 题目背景题目描述输入格式输出格式样例样例输入样例输出 思路及部分实现完整代码 题目背景 NCL 是一家专门从事计算器改良与升级的实验室&#xff0c;最近该实验室收到了某公司所委托的一个任务&#xff1a;需要在该公司某型号的计算器上加上解一元一次方程的功能。实…

2017年上半年上午易错题(软件设计师考试)

CPU 执行算术运算或者逻辑运算时&#xff0c;常将源操作数和结果暂存在&#xff08; &#xff09;中。 A &#xff0e; 程序计数器 (PC) B. 累加器 (AC) C. 指令寄存器 (IR) D. 地址寄存器 (AR) 某系统由下图所示的冗余部件构成。若每个部件的千小时可靠度都为 R &…

【Python机器学习】零基础掌握partial_dependence检验、检查

在医疗健康的领域,有一个问题一直困扰着专家——如何从多个健康指标中找出影响患者健康最关键的因素?在这样的场景下,做出准确的预测非常关键,因为它直接关联到患者的生命安全。 解决这一问题的一个有效方法是利用机器学习算法,具体来说就是通过偏依赖图(Partial Depend…

微信小程序在线预览PDF文件

需求&#xff1a;微信小程序在线预览PDF合同文件&#xff0c;加载完成后强制阅读10秒才可点击同意按钮 H5代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" cont…

如何使用手机蓝牙设备作为电脑的解锁工具像动态锁那样,蓝牙接近了电脑,电脑自动解锁无需输入开机密码

环境&#xff1a; Win10 专业版 远程解锁 蓝牙解锁小程序 问题描述&#xff1a; 如何使用手机蓝牙设备作为电脑的解锁工具像动态锁那样&#xff0c;蓝牙接近了电脑&#xff0c;电脑自动解锁无需输入开机密码 手机不需要拿出来&#xff0c;在口袋里就可以自动解锁&#xff…

nlp之加载电商评论集

目录 代码代码解读 代码 import pandas as pddf pd.read_csv("../data/Clothing Reviews.csv") print(df.info())df[Review Text] df[Review Text].astype(str) x_train df[Review Text] y_train df[Rating]from tensorflow.keras.preprocessing.text import To…

Geeker-Admin中ProTable表格分页之自定义接口页码、尺寸参数

最近挖了个新玩意儿&#xff0c;Geeker-Admin&#xff0c;看起来感觉挺好。 鼓捣了半天搞定了与服务端的API接口对接&#xff0c;但在表格分页的时候又遇到了问题&#xff0c;系统默认是pageNum/pageSize这两个参数名用来分页&#xff0c;而服务端是current/size&#xff0c;开…

C#,数值计算——分类与推理,基座向量机的 Svmgenkernel的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public abstract class Svmgenkernel { public int m { get; set; } public int kcalls { get; set; } public double[,] ker { get; set; } public double[] y { get; set…