当前位置: 首页 > news >正文

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 编程基础与算法入门,为解决实际问题打下坚实基础。
在这里插入图片描述

相关文章:

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

Python 算法高级篇&#xff1a;堆排序的优化与应用 引言 1. 什么是堆&#xff1f;2. 堆的性质3. 堆排序的基本原理4. 堆排序的 Python 实现5. 堆排序的性能和优化6. 堆排序的实际应用7. 总结 引言 堆排序是一种高效的排序算法&#xff0c;它基于数据结构中的堆这一概念。堆排序…...

视频下载软件 Downie4 mac中文介绍

Downie mac是一款Mac平台上非常实用的视频下载工具。它支持下载各种视频网站上的视频&#xff0c;并且具有快速、稳定、易于使用的特点。 Downie支持下载各种视频网站上的视频&#xff0c;包括YouTube、Vimeo、Netflix、Hulu、Amazon等等。它具有快速、稳定的下载速度&#xff…...

计算机操作系统重点概念整理-第一章 计算机系统概述【期末复习|考研复习】

第一章 计算机系统概述 【期末复习|考研复习】 计算机操作系统系列文章传送门&#xff1a; 第一章 计算机系统概述 第二章 进程管理 第三章 进程同步 第四章 内存管理 第五章 文件管理 第六章 输出输出I/O管理 文章目录 第一章 计算机系统概述 【期末复习|考研复习】前言一、计…...

树莓派基金会近日发布了新版基于 Debian 的树莓派操作系统

树莓派基金会&#xff08;Raspberry Pi Foundation&#xff09;近日发布了新版基于 Debian 的树莓派操作系统&#xff08;Raspberry Pi OS&#xff09;&#xff0c;为树莓派单板电脑带来了新的书虫基础和一些重大变化。 新版 Raspberry Pi OS 的最大变化是它现在基于最新的 Deb…...

Web项目如何做单元测试

你可能会用单元测试框架&#xff0c;python的unittest、pytest&#xff0c;Java的Junit、testNG等。 那么你会做单元测试么&#xff01;当然了&#xff0c;这有什么难的&#xff1f; test_demo.py def inc(x):return x 1def test_answer():assert inc(3) 4 inc() 是定义的…...

MySQL主从复制(基于GTID--事务ID方式)

目录 一、GTID相关概念1.GTID 是什么&#xff1f;2.GTID主从复制方式概念3.GTID的优缺点 二、GTID工作原理三、部署主从复制四、测试同步1.主库上新建数据库2.从库上查看是否同步成功 五、重设从库六、常见故障七、故障切换八、GTID的一些疑问1.为什么基于GTID的同步也要打开bi…...

3.72 Command Buffer及URP概述

一、Command Buffer 1.概念 CommandBuffer携带一系列的渲染命令&#xff0c;依赖相机&#xff0c;用来拓展渲染管线的渲染效果。而且可以指定在相机渲染的某个点执行本身的拓展渲染。Command buffers也可以结合屏幕后期效果使用。 简单来说就是可以在渲染流程中插入一些自定…...

分布式理论和分布式锁知识点总结

文章目录 (一) 分布式理论算法和协议1&#xff09;CAP理论总结 2&#xff09;BASE理论BASE 理论的核心思想基本可用软状态最终一致性 3&#xff09;Paxos算法Basic Paxos 算法4&#xff09; Raft算法1 拜占庭将军 5&#xff09;Gossip协议 (二) 分布式锁分布式锁应该具备哪些条…...

IOC课程整理-17 Spring事件

1. Java 事件/监听器编程模型 2. 面向接口的事件/监听器设计模式 3. 面向注解的事件/监听器设计模式 4. Spring 标准事件-ApplicationEvent 5. 基于接口的 Spring 事件监听器 6. 基于注解的 Spring 事件监听器 7. 注册 Spring ApplicationListener 8. Spring 事件发布器 9. Spr…...

大数据Flink(一百零五):SQL性能调优

文章目录 SQL性能调优 一、 ​​​​​​​MiniBatch 聚合...

ESP8266,手机与电脑之间的TCP通讯

电脑端运行通讯猫调试助手,作为服务端: 电脑端 电脑的IP地址是: 192.168.2.232 手机与电脑之间的TCP通讯 手机端运行网络调试精灵,作为客户端: 手机端 如果从手机端点击"发送"按钮,则也会将"ghhh东方红广场"几个字发送到电脑上(服务端). ESP8266作为客户…...

vue的数据监听是如何实现的?

Vue的数据监听是通过数据劫持和发布订阅模式来实现的。 数据劫持&#xff1a;Vue通过使用Object.defineProperty()方法来劫持数据对象的属性&#xff0c;并使用getter和setter来监听属性的变化。当属性被修改时&#xff0c;setter方法会被调用&#xff0c;从而触发相应的监听函…...

埋点日志解决方案——Golang+Gin+Sarama VS Java+SpringCloudGateway+ReactorKafka

埋点日志解决方案——GolangGinSarama VS JavaSpringCloudGatewayReactorKafka 之前我就写过几篇OpenRestylua-kafka-client将埋点数据写入Kafka的文章&#xff0c;如下&#xff1a; Lua将Nginx请求数据写入Kafka——埋点日志解决方案 python定时任务执行shell脚本切割Nginx…...

LeetCode 541 反转字符串 II 简单

题目 - 点击直达 1. 541 反转字符串 II 简单1. 题目详情1. 原题链接2. 题目要求3. 基础框架 2. 解题思路1. 思路分析2. 时间复杂度3. 代码实现 1. 541 反转字符串 II 简单 1. 题目详情 给定一个字符串 s 和一个整数 k&#xff0c;从字符串开头算起&#xff0c;每计数至 2k 个…...

从入门到精通:深入了解CSS中的Grid网格布局技巧和应用!

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! ​ 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一…...

Android Studio Giraffe 添加 maven { url “https://jitpack.io“ }报错

Android Studio Giraffe 添加 maven { url “https://jitpack.io” }报错 settings.gradle.kts:13:21: Unexpected tokens (use ; to separate expressions on the same line)解决方法 新版maven写法发生了改变&#xff1a; maven { url uri("https://jitpack.io"…...

Linux C/C++ 实现网络流量分析(性能工具)

网络流量分析的原理基于对数据包的捕获、解析和统计分析&#xff0c;通过对网络流量的细致观察和分析&#xff0c;帮助管理员了解和优化网络的性能、提高网络安全性&#xff0c;并快速排查和解决网络故障和问题。 Linux中的网络流量常见类型 在Linux中&#xff0c;网络流量可以…...

python门牌制作,统计某个数字出现的次数

题目&#xff1a; 小蓝要为一条街的住户制作门牌号。 这条街一共有 2022位住户&#xff0c;门牌号从 1 到 2022 编号。 小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符&#xff0c;最后根据需要将字符粘贴到门牌上&#xff0c;例如门牌 1017 需要依次粘贴字符 1、0、1、…...

轻量封装WebGPU渲染系统示例<7>-材质多pass(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/version-1.01/src/voxgpu/sample/MultiMaterialPass.ts 此示例渲染系统实现的特性: 1. 用户态与系统态隔离。 2. 高频调用与低频调用隔离。 3. 面向用户的易用性封装。 4. 渲染数据和渲染机制分离。 …...

0030Java程序设计-积分管理系统论文

文章目录 摘  要**目  录**系统实现系统功能需求3.2.1 管理员功能3.2.2 柜员功能 开发环境 摘  要 随着计算机和网络的不断革新&#xff0c;世界已经进入了前所未有的电子时代。作为实用性强、应用范围广泛的会员管理系统也正在被越来越多的各类企业用于消费管理领域。然…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...