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

排序算法-堆排序

1、堆

堆在形式上是一棵完全二叉树(假设树的高度是h,所有的叶子结点都是在第h层或h-1层)

堆分为两类,大根堆和小根堆:

  • 大根堆:每个结点的值都大于等于其孩子结点的值;
  • 小根堆:每个结点的值都小于等于其孩子结点的值;

堆在形式上是一棵完全二叉树,用数组存储它,不会浪费空间;

2、堆排序的过程

(1)从无序序列所确定的完全二叉树的第一个非叶子结点开始,从右到左,从下到上,对每个结点进行调整,最终得到一个大(小)顶堆。

(2)将根结点a与无序序列中最后一个元素b交换,a进入有序序列,结点b不满足堆,进行调整。

(3)重复(2),直到无序序列只剩下1个,排序结束。

3、算法实现

def sift(arr, i, n):  j = 2*i + 1temp = arr[i]while j < n:if j + 1 < n and arr[j] < arr[j+1]:j += 1if temp >= arr[j]:breakarr[i] = arr[j]i = jj = 2*i+1    arr[i] = temp
def heap_sort(arr):if not arr or len(arr) <= 1:returnn = len(arr)for i in range(n//2-1, -1, -1):  # 建堆sift(arr, i, n)for i in range(n, 0, -1):arr[0], arr[i-1] = arr[i-1], arr[0]  # 堆顶和最后一个无序元素交换位置sift(arr, 0, i-1)     # 调整堆if __name__ == '__main__':a = [10, 1, 5, 2, 4, 3, 2, 1]
#     a = [5, 8, 7, 6, 3, 2, 1]heap_sort(a)print(a)

4、复杂度分析

时间复杂度:O(nlogn)

空间复杂度:O(1)

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 甲方(北汽)渗透测试面试经验分享
  • Nginx: 负载均衡场景下上游服务器异常时的容错机制
  • github访问加速项目@一键部署自动更改host修改加速Github访问
  • k8s调度器Scheduler
  • Lodash——JavaScript中的工具库
  • buuctf [MRCTF2020]hello_world_go
  • 速盾:服务器接入cdn后上传图片失败怎么解决?
  • 主控和从控!!!
  • (二) 初入MySQL 【数据库管理】
  • C语言试题(含答案解析)
  • 发布npm包到GitLab教程
  • 树莓派+艺术品,有没有搞头?
  • 网络安全之DC-1靶机渗透实验
  • OZON免费选品工具大揭秘
  • 【Rust光年纪】深度解读:Rust语言中各类消息队列客户端库详细对比
  • Brief introduction of how to 'Call, Apply and Bind'
  • Java多线程(4):使用线程池执行定时任务
  • uni-app项目数字滚动
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 区块链分支循环
  • 深入 Nginx 之配置篇
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 无服务器化是企业 IT 架构的未来吗?
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • ​Redis 实现计数器和限速器的
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (第一天)包装对象、作用域、创建对象
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (六)Hibernate的二级缓存
  • (十七)Flink 容错机制
  • (算法)硬币问题
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET 项目中发送电子邮件异步处理和错误机制的解决方案
  • .net6Api后台+uniapp导出Excel
  • :=
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @antv/g6 业务场景:流程图
  • @DataRedisTest测试redis从未如此丝滑
  • @WebService和@WebMethod注解的用法
  • [AMQP Connection 127.0.0.1:5672] An unexpected connection driver error occured
  • [C#]winform部署官方yolov10目标检测的onnx模型
  • [CF494C]Helping People
  • [CF543A]/[CF544C]Writing Code
  • [CR]厚云填补_多云条件下土地覆盖分割的多模态多任务学习
  • [leetcode] Longest Palindromic Substring
  • [leetcode]Clone Graph
  • [MT8766][Android12] 增加应用安装白名单或者黑名单
  • [mvc] 简单的forms认证
  • [PAT练级笔记] 34 Basic Level 1034 有理数四则运算