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

堆排序和topk问题

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、堆排序定义
  • 二、时间复杂度
  • 三、实现思路
    • a.注意(升/降)
  • 四、topk问题

前言

常见的基本排序算法有冒泡、选择、插入,但效率太低。
堆排序和快速排序算法则是相对高效的算法。这篇主要先介绍堆排序


一、堆排序定义

堆排序就是借助(大/小)堆的特性,实现的快速排序

二、时间复杂度

时间复杂度:N * log2
本质就是建堆后,借助堆来调整N个数的位置,每次调整时间为堆高度log2

三、实现思路

(以小堆为例)

  1. 先将数据建小堆,此时堆顶是最小值。
  2. 将堆顶元素与数组末尾的元素交换,此时最小值被放到数组末尾。
  3. 将堆的有效长度-1,末尾元素视为已排序,不参与后续调整。
  4. 对堆顶的元素进行向下调整,使其重新满足小堆的特性
  5. 重复上述过程,直到堆的有效长度为1
//实现堆排序————时间复杂度:N * logN (一次向下调整是N, 执行N次)voidHeapSort(int*a,intn){//1、建堆for(inti=(n-1-1)/2;i>=0;i--)//需要从最后一个节点的父亲节点,开始向下调整{AdjustDown(a,n,i);}//2、将排序好的最小值,排出堆排序的范围intend=n-1;//3、再一直对根节点实现向下调整while(end>0){swap(&a[0],&a[end]);//再次选择最小的值AdjustDown(a,end,0);end--;}}

至此,实现了数组的降序排列

a.注意(升/降)

排升序,建大堆
排降序,建小堆

因为每次堆顶会和数组末尾的元素交换


四、topk问题

N个数中找出最大或最小的前K个数?

最优方案:建立一个K的数的堆。
如果想找K个最大数就建小堆,想找K个最小数就建大堆
(以小堆为例)

遍历N-K个数,凡是比堆顶大的数就替换堆顶数据,进堆向下调整。
(因为堆顶的数总是较小的)最后剩下的k个数就是前K个最大的数。

前K个最小的数同理可得。

http://www.jsqmd.com/news/120336/

相关文章:

  • 【计算机毕业设计案例】基于SpringBoot的社区线上团购系统设计与实现基于springboot的社区团购系统的设计与实现(程序+文档+讲解+定制)
  • 2025年终优选:0-16岁儿童鞋服宝藏品牌大公开 - 品牌测评鉴赏家
  • 【MTSP问题】基于螳螂虾算法MShOA求解单仓库多旅行商问题附Matlab代码
  • Java计算机毕设之基于springboot的物业报修系统的设计与实现住户信息管理、报修处理、费用收缴(完整前后端代码+说明文档+LW,调试定制等)
  • LLMs、RAG、AI Agent 三个到底什么区别?
  • 这段代码中的 ttl是做什么的
  • 【NWFSP问题】基于雪橇犬算法SDO求解零等待流水车间调度问题NWFSP附Matlab代码
  • ES知识点二
  • 2025年度最值得入手的国产儿童鞋服品牌大盘点 - 品牌测评鉴赏家
  • C#之Modbus-RTU通讯-读取输出寄存器-整数
  • 【课程设计/毕业设计】基于springboot的社区团购系统的设计与实现商品管理、团长运营、订单处理、售后跟踪等功能【附源码、数据库、万字文档】
  • 休闲无聊测试AI大模型生成
  • 视频播放器PotPlayer下载安装教程:超详细图文步骤(PC+安卓)
  • 【路径规划】基于RRT算法结合卡尔曼滤波器相实现定位不确定环境下移动机器人路径规划附matlab代码
  • 【油井】基于matlab模拟隐式二维油井(含渗透率和压力随时间的变化)
  • python多表关联防注入sql
  • 2025年中国十大童装品牌盘点:从品质到风格,哪款戳中你的心? - 品牌测评鉴赏家
  • 【课程设计/毕业设计】基于springBoot物业智慧系统设计与实现基于springboot的物业报修系统的设计与实现【附源码、数据库、万字文档】
  • Java计算机毕设之基于springboot的幼儿园管理系统的设计与实现为幼儿园(含普惠园、民办园、连锁园)设计的 “家园共育 + 日常运营 + 安全监管(完整前后端代码+说明文档+LW,调试定制等)
  • Java毕设选题推荐:基于springboot的幼儿园管理系统的设计与实现幼儿信息管理(基本资料、健康档案、接送记录)【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 完整教程:npu_moe_distribute_combine算子代码分析
  • 用 .NET MAUI 10 + VS Copilot 从 0 开发一个签到 App(六)登录
  • 信息学奥赛一本通 1616:A 的 B 次方
  • 微信开发者secret和appid获取方法
  • 解锁大模型“能干活“的秘诀:RAG×MoE技术组合深度解析
  • Java毕设选题推荐:基于Java+springboot招投标管理系统设计与实现基于springboot的在线招标系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 2025 --【J+S 二十连测】-- 第十二套 总结+题解
  • Java计算机毕设之基于springboot的在线招标系统的设计与实现基于springboot招投标管理系统设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • 深入解析MySQL事务与锁:构建高并发数据系统的基石
  • android kotlinx.serialization用法和封装全解