Python中堆排序算法的实现

Python实现通用堆算法 首先我们需要了解堆的基本概念。堆是一种完全二叉树,通常分为两种情况:最大堆和最小堆。最大堆中,每个节点的值都大于等于它的子节点的值;最小堆中,每个节点的值都小于等于它的子节点的值。堆是一种重要的数据结构,可用于排序、查找最大/小值等操作。本篇文章将介绍如何使用Python实现一个通用的堆算法,并附上完整的源代码。以上就是Python实现通用堆算法的全部内容,希望对您有所帮助!,用于指定比较函数。如果未指定,则默认使用大于号进行比较。Python实现通用堆算法。Heap类有一个可选的参数。 阅读详情

堆排序是一种在Python中对数组和列表进行排序的强大算法。它很受欢迎,因为它非常快,而且不像合并排序和快速排序那样需要任何额外的空间。

堆排序的时间复杂度是O(n*log(n)) 。

堆排序是一种原地算法,它不会再创建任何数据结构来保存数据的中间状态。相反,它对我们的原始数组进行了修改。

因此,当数据非常大时,这为我们节省了大量的空间。

这种算法的唯一缺点是,它非常不稳定。如果我们的数组中的多个元素在不同的索引上有相同的值,它们的位置在排序时就会发生变化。

堆排序算法的工作原理是递归地创建一个最小堆或最大堆,取出根节点,将其放在我们数组中第一个未排序的索引处,并将最后一个堆元素转换为根节点。

这个过程是递归重复的,直到我们的堆内只剩下一个节点。最后,最后一个堆元素被放置在我们数组的最后一个索引上。

如果我们想一想,这个过程类似于选择排序算法,因为我们取最大或最小的值,并把它们放在我们排序数组的顶部。

实现堆排序算法

我们首先看看实现build_heap() 函数,该函数需要原始数组、数组的长度和我们父节点的索引。在这里,如果我们看一个数组,最后一个父节点的索引位于我们数组里面的(n//2 - 1) 。

同样地,该特定父节点的左侧子节点的索引是2parent_index + 1 ,右侧子节点的索引是2parent_index + 2 。

在这个例子中,我们正试图创建一个最大堆。这意味着每个父节点需要大于其子节点。

为此,我们将从最后一个父节点开始,向上移动到我们堆的根节点。如果我们想创建一个最小堆,我们将希望所有的父节点都小于其子节点。

这个build_heap() 函数将检查左边或右边的子节点是否比当前的父节点大,并将最大的节点与父节点交换。

这个函数递归地调用自己,因为我们要对堆中所有的父节点逐步重复前面的过程。

下面的代码片断演示了上面提到的built_heap() 函数在Python中的一个工作实现。

def build_heap(arr, length, parent_index):
    largest_index = parent_index
    left_index = 2 * parent_index + 1
    right_index = 2 * parent_index + 2
    if left_index < length and arr[parent_index] < arr[left_index]:
        largest_index = left_index
    if right_index < length and arr[largest_index] < arr[right_index]:
        largest_index = right_index
    if largest_index != parent_index:
        arr[parent_index],arr[largest_index] = arr[largest_index],arr[parent_index]
        build_heap(arr, length, largest_index)

现在,我们有了一个函数,它取我们数组内的最大值,并把它放在我们堆的根部。我们需要一个函数来获取未排序的数组,调用build_heap() 函数并从堆中提取元素。

下面的代码片断演示了Python中heapSort() 函数的实现。

def heapSort(arr):
    length = len(arr)
    for parent_index in range(length // 2 - 1, -1, -1):
        build_heap(arr, length, parent_index)
    for element_index in range(length-1, 0, -1):
        arr[element_index], arr[0] = arr[0], arr[element_index]
        build_heap(arr, element_index, 0)

我们在我们的数组内逐步调用每个父节点的build_heap() 函数。注意,我们给length//2-1 作为起始索引,给-1 作为结束索引,步长为-1 。

这意味着我们从最后一个父节点开始,逐步减少我们的索引,直到我们到达根节点。

第二个循环for ,从我们的堆中提取元素。它也是从最后一个索引开始,在我们数组的第一个索引处停止。

我们在这个循环中交换我们数组的第一个和最后一个元素,并通过传递0作为根索引在新排序的数组上执行build_heap() 函数。

现在,我们已经编写了我们的程序来实现Python中的堆排序。现在是时候对一个数组进行排序并测试上面的代码了。

#Python小白学习交流群:153708845
arr = [5, 3, 4, 2, 1, 6]
heapSort(arr)
print("Sorted array :", arr)

输出:

Sorted array : [1, 2, 3, 4, 5, 6]

正如我们所看到的,我们的数组已经完全排序了。这意味着我们的代码运行良好。

如果我们想按降序排序,我们可以创建一个最小堆而不是上面实现的最大堆。

本文不会解释min-heap,因为在本教程的开头已经讨论了什么是min-heap。

我们的程序以如下方式工作。下面的块显示了我们的数组在代码执行的每个阶段的状态。

Original Array [5, 3, 4, 2, 1, 6] # input array
Building Heap [5, 3, 6, 2, 1, 4] # after build_heap() pass 1
Building Heap [5, 3, 6, 2, 1, 4] # after build_heap() pass 2
Building Heap [6, 3, 5, 2, 1, 4] # after build_heap() pass 3
Extracting Elements [6, 3, 5, 2, 1, 4] # before swapping and build_heap pass 1
Extracting Elements [5, 3, 4, 2, 1, 6] # before swapping and build_heap pass 2
Extracting Elements [4, 3, 1, 2, 5, 6] # before swapping and build_heap pass 3
Extracting Elements [3, 2, 1, 4, 5, 6] # before swapping and build_heap pass 4
Extracting Elements [2, 1, 3, 4, 5, 6] # before swapping and build_heap pass 5
Sorted array : [1, 2, 3, 4, 5, 6] # after swapping and build_heap pass 5

build_heap() 函数被执行3次,因为我们的堆中只有3个父节点。

之后,我们的元素提取阶段将第一个元素,与最后一个元素交换,并再次执行build_heap() 函数。这个过程对length - 1 ,我们的数组被排序了。

Python 算法基础篇:堆和优先队列的实现与应用 堆和优先队列是常用的数据结构,它们在算法和程序设计中有着广泛的应用。本篇博客将重点介绍堆和优先队列的原理、实现以及它们在不同场景下的应用。我们将使用 Python 来演示堆和优先队列的实现,并通过实例展示每一行代码的运行过程。 阅读详情

相关推荐

Python编程实例-Python中的堆

在本文中,我们将从头开始了解堆。我们将首先揭开堆是什么以及它们固有的属性。然后,我们将深入探讨Python中堆的实现,即heapq模块,并探索其丰富的函数集。

视觉与物联智能 476

一种终极高效排序算法——堆排序python实现(超详解)0基础强化版

在学习堆排序之前之前需要具备什么知识?递归,二叉树堆排序的基本思想是将待排序的序列构建成一个堆,然后依次将元素与元素交换,并将堆的大小,然后再对剩余的堆进行调整,使其满足堆的性质。重复这个过程,,此时排序完成。二、堆排序性能:2.1时间复杂度:时间复杂度:O(nlogn)和。O(n)n-1O(logn)lognO(nlogn)由于排序步骤是主要的耗时操作,所以堆排序的整体时间复杂度为O(nlogn)。无论是在最好情况、平均情况还是最坏情况下,堆排序的时间复杂度都是O(nlogn)。

2301_81267493的博客 3939

DIY电磁炉核心驱动方案:IR2153PBF自振荡半桥芯片实战指南(附电路图)

本文详细介绍了IR2153PBF自振荡半桥驱动芯片在DIY电磁炉核心驱动方案中的实战应用。该芯片集成了振荡器与600V高压驱动能力,仅需少量外围元件即可生成互补带死区的PWM信号,极大简化了半桥逆变电路设计。文章深入解析了其工作原理、关键参数,并提供了完整的电路设计、PCB布局指南及调试步骤,帮助电子爱好者构建稳定高效的感应加热驱动核心。

beer8的博客 595

如何在 Python 中实现堆栈

在本文中,我们将为您提供有关如何在 Python 中实现堆栈的分步指南。要在 Python 中实现堆栈,我们可以定义一个具有两个基本方法的堆栈类:push和pop。该push方法将一个新元素添加到堆栈的顶部,同时该pop方法从堆栈中删除并返回顶部元素。我们首先将初始节点压入堆栈,然后弹出节点并将它们的邻居压入堆栈,直到我们访问了图中的所有节点。在下一节中,我们将举例说明如何在 Python 编程中使用堆栈数据结构。现在我们已经在 Python 中实现了堆栈数据结构,让我们看一些如何在编程中使用它的示例。

我的博客,不一样的自我表达 815

保姆级教学:从0搭建微信小程序SpringBoot+Vue(一)

目标:实现一个微信小程序从后端数据库MySQL获取的商品展示页。 框架:后端采用SpringBoot,前端采用Vue,数据库MySQL。 部署工具:IntelliJ IDEA 2024.2专业版+HbuilderX+Node+微信开发者工具,jdk1.8已安装

weixin_44545610的博客 4927

5种超实用方法:快速获取Windows文件夹下所有文件名(含CMD/PowerShell脚本)

本文详细介绍了5种快速获取Windows文件夹下所有文件名的实用方法,包括图形界面操作、Excel数据导入、CMD命令和PowerShell脚本。特别提供了高效的CMD和PowerShell脚本示例,帮助用户轻松实现文件名的批量获取与管理,大幅提升工作效率。

opencv7vision的博客 453

python实现堆排序算法_Python实现的堆排序算法示例

本文实例讲述了Python实现的堆排序算法。分享给大家供大家参考,具体如下:堆排序的思想:堆是一种数据结构,可以将堆看作一棵完全二叉树,这棵二叉树满足,任何一个非叶节点的值都不大于(或不小于)其左右孩子节点的值。 将一个无序序列调整为一个堆,就可以找出这个序列的最大值(或最小值),然后将找出的这个值交换到序列的最后一个,这样有序序列就元素就增加一个,无序序列元素就减少一个,对新的无序序列重复这样的...

weixin_39862097的博客 172

用示波器抓一次MIPI D-PHY的波形,手把手教你读懂HS模式和LP模式的切换时序

本文详细解析了MIPI D-PHY信号的双模切换机制,包括高速模式(HS)和低功耗模式(LP)的波形捕获与诊断技巧。通过示波器设置、关键状态分析和实战案例,帮助工程师快速定位信号完整性问题,提升调试效率。

weixin_30696427的博客 461

堆排序python代码实现_python 实现堆排序算法代码

复制代码 代码如下:#!/usr/bin/pythonimport sysdef left_child(node):return node * 2 + 1def right_child(node):return node * 2 + 2def parent(node):if (node % 2):return (i - 1) / 2else:return (i - 2) / 2def max_he...

weixin_39526459的博客 162

别再让电池充不满!用CN3791芯片设计太阳能充电电路,这几个调试坑我帮你踩了

本文详细解析了使用CN3791芯片设计太阳能充电电路时的常见调试问题及解决方案。从RCS电阻的选择到MPPT电压偏差的修正,再到线路损耗和温度补偿的优化,提供了全面的避坑指南。通过实测数据和优化方案,帮助工程师提升锂电池充电效率,确保太阳能充电电路的稳定性和可靠性。

weixin_42528191的博客 243

我的世界进阶模组开发教程——制作机械动力附属模组

摘要: Create是Minecraft的机械动力模组,其代码结构分为多个关键模块: 数据生成系统:通过CreateRecipeProvider基类实现配方自动化生成,支持多步骤序列化装配配方(SequencedAssemblyRecipeGen),采用建造者模式链式调用; 注册管理:CreateRegistrate扩展了Registrate库,统一管理方块、流体、实体等注册,集成标签页分类和工具提示定制; 伤害系统:DamageTypeTagGen为机械伤害(如钻头、风扇火焰)定义原版兼容的标签; 客户端

qq_24992377的博客 2085

用python实现堆排序算法

用python 实现 堆排序算法

范枝洲的博客 898

超详细!Linux 服务器 6 大核心性能测试(附自动脚本 + 结果分析秘籍)---Linux 服务器性能测试文档

本文档旨在提供 Linux 服务器的 CPU、内存和磁盘性能测试方案,包括详细的测试大纲、操作步骤以及一键化测试脚本,帮助管理员快速评估服务器性能状况。通过以上测试方案,可以全面评估 Linux 服务器的 CPU、内存和磁盘性能,为系统优化、容量规划和问题排查提供重要参考依据。使用 sysbench 进行 CPU 基准测试。使用 sysbench 测试内存读写性能。使用 fio 工具进行更全面的磁盘测试。使用 dd 命令测试磁盘顺序读写性能。使用 dd 命令测试内存读写速度。记录磁盘 IO 性能。

jundao1997的专栏 381

基本算法——堆排序——python实现

目录 知识积累: 具体: ​第一步:建堆 第二步:主体 第三步:验证 第四步: 将堆释放 完整代码: 知识积累: 具体: 第一步:建堆 具体思路看注解 我们要大根堆 大的在上面 def sift(li,low,hight): ''' li ; 列表 low : 根节点的位置 hight : 堆最后一个元素的位置 return ''' i = low j = 2*i +1 ...

heart_6662的博客 842

JEDEC JESD51-14 瞬态双界面测试方法详解

(瞬态双界面测试方法,用于测量具有单路径热流的半导体器件的结到壳热阻 RθJC,包括结到壳顶部 RθJCT 和结到壳底部 RθJCB)。该标准于 2010 年发布(版本 JESD51-14.1),旨在提供一种准确、可重复的瞬态方法来测量功率半导体器件(如 MOSFET、IGBT)的结到壳热阻(RthJC),取代传统的稳态测量方法(如 MIL-STD-883E METHOD 1012.1)。方法,通过比较两种不同热界面材料(TIM)下的瞬态温度响应曲线,提取 RthJC,而无需直接测量壳温(Tc)。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 612

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Python实现堆排序算法

函数对输入数组进行排序,并输出结果。用于调整堆,使其满足堆的性质,Python实现堆排序算法。

adendean的博客 422

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

排序算法——堆排序Python实现

# -*- coding: utf-8 -*- """ @File : heap_sort.py @Author: Zhang_San @Time : 2020/7/20 17:51 @des : 堆排序:基于大根堆或者小根堆的一种排序,每次通过大/小根堆得特点,找出堆顶的元素,并跟当前子堆的最后一个元素交换,排除最后一个元素后, 新的子树重新形成堆,依次交换堆顶和最后当前堆的最后一个叶子元素,直到排序完成。 实现过程: (1)根据.

u011412768的博客 291

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

python实现排序算法——堆排序

       堆排序是非常好的排序,其时间复杂度不管什么情况一直都是在O(nlogn)O(nlogn)O(nlogn),空间复杂度还是O(1)O(1)O(1),可以说效果是非常好的。不过,堆排序首先要用到堆的概念,不如快速排序易于理解。而且,虽然其时间复杂度是O(nlogn)O(nlogn)O(nlogn),但是其在实现的过程中,其效率还是不如快速排序。 ...

海军上将光之翼的博客 370

排序算法(五)——堆排序算法详解及Python实现

本文目录一、简介二、算法介绍三、代码实现排序算法系列——相关文章 一、简介 堆排序(Heap Sort)算法,属于选择排序类,不稳定排序,时间复杂度O(nlogn)。 堆排序由Floyd和Williams在1964年共同发明,是对简单选择排序算法的优化,其出发点是:简单选择排序在遍历时,在待排序的n个元素中,需进行n-1次比较,才能选择出最小的元素,但没有将每次遍历时比较的结果保存下来,导致后续遍历时仍需进行重复操作,因此导致元素比较次数较多。 堆排序就是通过堆这种结构,实现了在选择出最小元素的同时,保存了

明月清風 2726

python堆排序法_python中堆排序算法如何实现?

在使用python中,你会遇到一个词,就是堆排序。那堆排序是什么呢?堆排序看字面意思是一种排序方法,那堆是什么呢?堆是一个近似完全二叉树的结构,并同时满足堆积的性质。其实堆排序是指利用堆这种数据结构所设计的一种排序算法。认识了堆排序,那你知道堆排序在python中如何实现吗?本文小编就像大家演示推排序在python的实现代码。代码:defheap_sort(array,n,length):l...

weixin_39613951的博客 151

Python 算法 实现堆排序

文章目录堆排序堆排序1 堆(heap)2 堆排序算法3 利用堆实现优先队列 堆排序 参考书《算法导论》 排序是算法中最为基础的问题,这篇文章是关于堆排序算法的理论和python实现 堆排序 在算法导论(一)中有两种排序方法,分别是归并排序和插入排序。其中归并排序有较好的渐近运行时间,而插入排序有空间原址性。堆排序综合了这两种排序的优点。 空间原址性 空间原址性是指,假设对一个序列进行排序,保存在序列外的数是常数级的,就称其具有空间原址性。 1 堆(heap) 堆是一种特殊的数据结构。一般下常常看作二叉树的数

wxyice的博客 558

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

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

专注于全栈开发领域 1063

python实现堆排序用类的方法_python 实现堆排序算法代码 -电脑资料

复制代码代码如下:#!/usr/bin/pythonimport sysdef left_child(node):return node * 2 + 1def right_child(node):return node * 2 + 2def parent(node):if (node % 2):return (i - 1) / 2else:return (i - 2) / 2def max_hea...

weixin_33577842的博客 152

python算法实现系列-堆排序

最近在学习排序算法,正好打算练习一下自己前段时间自学的python基础,就用python来实现这些算法。     本文实现堆(大顶堆)排序,代码如下: def heap_adjust(data, s, m): temp = data[s] j = 2 * s + 1 while j < m: if j < m - 1 and data[j] <

ziven tech 2358

堆排序算法-python实现

冒泡排序1.定义2时间复杂度:O(n^2^)3.比较次数:n^2^/2 (与初始顺序不同)4.交换次数:与初始顺序有关5.Python 实现: 1.定义 冒泡排序就是重复“从序列右边考试比较相邻两个数字大小,再根据结果交换两个数字的位置” 2时间复杂度:O(n2) 3.比较次数:n2/2 (与初始顺序不同) 4.交换次数:与初始顺序有关 5.Python 实现: #!/usr/bin/env py...

qq_24403067的博客 186
上一篇: Python教程:@符号的用法
下一篇: Python用于解析和修改文本数据-pyparsing模块教程
Python热爱者
博客等级 码龄7年 3059粉丝 1330原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值