排序算法-堆排序

news/2024/9/25 9:39:00/

  一、二叉堆的特性:

1、最大堆的堆顶是整个堆中的最大元素。

2、最小堆的堆顶是整个堆中的最小元素。

      以最大堆为例,如果删除一个最大堆的堆顶(并不是完全删除,而是跟末尾的节点交换位置),经过自我调整,第2大的元素就会被交换上来,成为最大堆的新堆顶。 

二、堆排序

算法>排序算法步骤:

1、把无序数组构建成二叉堆。

            从小到大排序,则构建成最大堆;

            从大到小排序,则构建成最小堆。

2、循环删除堆顶元素,替换到二叉堆的末尾,调整堆产生新的堆顶。

        第1步,把无序数组构建成二叉堆,这一步的时间复杂度是O (n)。

        第2步,需要进行n-1次循环。每次循环调用一次down_adjust方法,所以第2步的计算规模是(n-1) xlogn,时间复杂度为O ( nlogn) 。

        两个步骤是并列关系,所以整体的时间复杂度是O (nlogn)。

 如图所示:

 

def down_adjust(p_index,length,ll):'''下沉:param p_index:  父节点索引:param length:  大小:param ll:  数列:return:'''#保存父节点元素temp=ll[p_index]#左子节点索引sub_index=2*p_index+1#循环while sub_index <length:# 如果有右孩子,且右孩子的值大于左孩子的值,则定位到右孩子if sub_index+1<length and ll[sub_index+1]>ll[sub_index]:sub_index+=1# 如果父节点的值>=任何一个孩子的值,直接跳出if temp>=ll[sub_index]:break#无需真正交换#子节点元素赋给父节点元素ll[p_index]=ll[sub_index]#子节点索引重新赋值给父节点索引p_index=sub_index#子节点索引sub_index = 2 * sub_index + 1#父节点元素ll[p_index]=tempdef heapSort(ll):#1.把无序数组构成最大堆for i in range((len(ll)-2)//2,-1,-1):down_adjust(i,len(ll),ll)#2.循环删除堆顶元素,替换到二叉堆的末尾,调整堆产生新的堆顶。for i in range(len(ll)-1,0,-1):#最后一个与第一个元素交换t=ll[i]ll[i]=ll[0]ll[0]=t#下沉调整最大堆down_adjust(0,i,ll)if __name__ == '__main__':ll = [10, 8,9, 7, 5, 4, 6, 3,2]print('排序前:')print(ll)# 调用方法排序heapSort(ll)print('排序后:')print(ll)

 

 相同点,堆排序和快速排序的平均时间复杂度都是O (nlogn),并且都是不稳定排序。

 不同点,快速排序的最坏时间复杂度是O (n2),而堆排序的最坏时间复杂度稳定在O (nlogn)。

 


http://www.ppmy.cn/news/1445378.html

相关文章

恒峰智慧科技—高扬程消防水泵:守护生命安全的坚强后盾

在消防领域&#xff0c;高扬程消防水泵以其独特的优势&#xff0c;成为了灭火救援工作中不可或缺的重要设备。这种专业消防设备具备高扬程、高压、大流量等特点&#xff0c;能够在短时间内将大量水源输送到远距离的火场&#xff0c;为灭火工作提供有力的支持。 无论是广袤无垠的…

Python发送digest认证的请求:requests.auth.HTTPDigestAuth/httpx.DigestAuth

近日在做摄像头接口的调试&#xff0c;需要用到Digest认证&#xff0c;经过试验&#xff0c;代码如下&#xff1a; 一、同步版(pip install requests) import requests from requests.auth import HTTPDigestAuthhost https://192.168.0.2 path /api/xxx path2 /another/a…

eNSP学习——静态路由及默认路由基本配置

目录 知识背景 实验目的 实验步骤 实验内容 实验拓扑 实验编址 实验前期准备 实验步骤 1、基本配置&#xff08;按照实验编址设置好对应的IP地址&#xff09; 2、是实现主机之间的通信 3、实现全网全通来增强网络的可靠性 4、使用默认路由实现简单的网络优化 需要各…

oneapi:强大而易用的OpenAI接口管理和分发系统 大模型 通用接口 ollama

使用One-api代理我所有的各类接口渠道,包括gpt-3.5-trubo、gpt-4等openAI官方模型,azure提供的模型,集成联网知识库等功能的gpt4模型,以及国内模型的一些模型。同时支持openai图像生成接口。 1. 准备工作 创建应用目录,例如在/share/Container下创建文件夹oneapi在oneapi…

CI/CD:基于kubernetes的Gitlab搭建

1. 项目目标 &#xff08;1&#xff09;熟悉使用k8s环境搭建Gitlab &#xff08;2&#xff09;熟练应用Gitlab基本配置 2. 项目准备 2.1. 规划节点 主机名 主机IP 节点规划 k8s-master 10.0.1.1 kube_master k8s-node1 10.0.1.2 kube_node k8s-node2 10.0.1.3 k…

设计模式学习笔记 - 项目实战二:设计实现一个通用的接口幂等框架(实现)

概述 上篇文章&#xff0c;我们讲解了幂等框架的设计思路。在正常情况下&#xff0c;幂等框架的处理流程是比较简单的。调用方生成幂等号&#xff0c;传递给实现方&#xff0c;实现方记录幂等号或者用幂等号判重。但是&#xff0c;幂等框架要处理的异常情况很多&#xff0c;这…

win下安装desktop及使用desktop安装k8s

1、下载desktop安装包 Docker Desktop: The #1 Containerization Tool for Developers | Docker 2、点击exe文件进行安装 3、安装完需要在启用或关闭windows功能中勾选如下三个选项 4、在desktop中配置Docker Engine { "registry-mirrors": [ "https:/…

内网端口转发与代理

思路&#xff1a;渗透的前提是双方能够建立通信。目前无法和win7建立通信&#xff0c;但是拿到了windows2003的权限&#xff0c;所以可以在Windows2003主机上面建立节点&#xff0c;作为跳板机去访问到内网。 目前状态&#xff1a;控制win2003&#xff08;IP&#xff1a;192.1…