堆排序与取topK java实现
1.堆排序思路
最近趁着有点时间,稍微复习了一下数据结构相关内容,温习了一下堆排序,做一下记录。
首先我们复习一下什么是堆:
堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。
堆排序的基本思想如下:
将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。
更具体的过程与图示,见参考文献1,不再重新画图。
2.java实现
下面我们用java来实现一下堆排序的过程。
public class HeapSort {public static void swap(int[] arr, int i, int j) {int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}public static void adjust(int[] arr, int start, int end) {// 左右子节点int left = start * 2 + 1;int right = start * 2 + 2;int largest = start;if (left <= end && arr[left] > arr[largest]) largest = left;if (right <= end && arr[right] > arr[largest]) largest = right;// 交换数据,并继续调整if (largest!= start) {swap(arr, start, largest);adjust(arr, largest, end);}}// 从第一个非叶子结点开始调整,注意顺序是从下往上public static void buildHeap(int[] arr) {for(int i = arr.length / 2 - 1; i >= 0; i--) {adjust(arr, i, arr.length - 1);}}// 先构建堆,此时堆顶为最大元素,交换到此时数组的最后一位。public static void heapSort(int[] arr) {buildHeap(arr);for(int i = arr.length - 1; i > 0; i--) {swap(arr, 0, i);adjust(arr, 0, i - 1);}}public static void main(String[] args) {int[] arr = {1, 3, 5, 6, 2, 4, 6, 9, 8, 10, 7};heapSort(arr);for(int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}
}
关键的步骤以及作用,都已经在代码中进行了注释,再结合参考文献1就可以容易理解。
3.求topK
求一个无序序列的topK,是个经典问题。这个经典问题的经典解法,就包括堆排序。
public static void findTopK(int[] arr, int k) {PriorityQueue<Integer> pq = new PriorityQueue();for (int i = 0; i < k; i++) {pq.offer(arr[i]);}for (int i = k; i < arr.length; i++) {int current = pq.peek();if (arr[i] > current) {pq.poll();pq.offer(arr[i]);}}Integer[] ret = pq.toArray(new Integer[k]);Arrays.sort(ret, Collections.reverseOrder());for(int i = 0; i < k; i++) System.out.print(ret[i] + " ");}
public static void findLastK(int[] arr, int k) {PriorityQueue<Integer> pq = new PriorityQueue<Integer>((Integer o1, Integer o2) -> o2 - o1);for (int i = 0; i < k; i++) {pq.offer(arr[i]);}for (int i = k; i < arr.length; i++) {int current = pq.peek();if (arr[i] < current) {pq.poll();pq.offer(arr[i]);}}Integer[] ret = pq.toArray(new Integer[k]);Arrays.sort(ret);for(int i = 0; i < k; i++) System.out.print(ret[i] + " ");}
public static void main(String[] args) {int[] arr = {1, 3, 5, 10, 8, 6, 7, 9, 2, 4};int k = 3;findTopK(arr, k);System.out.println();findLastK(arr, k);}
上面的代码,分别找到最大的三个数与最小的三个数。
PriorityQueue 是java中的优先队列,默认就是小顶堆实现。求top3最大值时候,用小顶堆即可。如果求top3最小值,则使用大顶堆。
上面代码运行最后的输出:
10 9 8
1 2 3
参考文献
1.https://www.cnblogs.com/chengxiao/p/6129630.html
相关文章:
堆排序与取topK java实现
1.堆排序思路 最近趁着有点时间,稍微复习了一下数据结构相关内容,温习了一下堆排序,做一下记录。 首先我们复习一下什么是堆: 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,…...
https通信流程通俗理解
场景,假设A和B进行通信 CA: ( Certificate Authority )就是颁发 HTTPS 证书的组织。 通信流程步骤: 1、A告诉B使用 RSA算法进行加密,B说好的。 2、A和B同时用 RSA算法各自生成一对公钥密钥,各自的公钥密钥都不同。 3…...
银行零售业务转型方法论:打造数字化的“有机体”
传统的业务增长进度叫做连续性创新,它是在一条曲线上渐进性的改良和发展,但这种发展终有极限,如果不能及时开辟第二增长曲线,就很容易被时代所抛弃。过去十年,以互联网为代表的数字化转型的先行者,不断冲击…...
【STM32】STM32使用RFID读卡器
STM32使用RFID读卡器 RFID卡片 ID卡(身份标识):作用就是比如你要输入学号,你刷卡直接就相当于输入学号,省去了输入的过程 IC卡:集成电路卡,是将一种微电子芯片嵌入卡片之中 RFID的操作 1、…...
spring集成mybatis的原理
spring是怎样和mybatis继承的? 在idea里点mapper.queryOne()直接跳到了接口或xml,它究竟是怎样利用jdbc执行的? 我直接调用mapper.queryOne是怎么使用的sqlsession?怎么去connect的? mybatis是怎样根据mapper找到对应的…...
限速神器RateLimiter源码解析 | 京东云技术团队
作者:京东科技 李玉亮 目录指引 限流场景 软件系统中一般有两种场景会用到限流: •场景一、高并发的用户端场景。 尤其是C端系统,经常面对海量用户请求,如不做限流,遇到瞬间高并发的场景,则可能压垮系统…...
spring中怎样优化第三方bean?
需求:将数据库连接四要素提取到properties配置文件,spring来加载配置信息并使用这些信息来完成属性注入。第三方bean属性优化的思路如下: 1.在resources下创建一个jdbc.properties(文件的名称可以任意) 2.将数据库连接四要素配置到配置文件中 3.在Spr…...
8分钟的面试,我直呼太变态了......
干了两年外包,本来想出来正儿八经找个互联网公司上班,没想到算法死在另一家厂子。 自从加入这家外包公司,每天都在加班,钱倒是给的不少,所以也就忍了。没想到11月一纸通知,所有人不许加班,薪资…...
别去外包,干了3年,彻底废了......
先说一下自己的情况。大专生,19年通过校招进入湖南某软件公司,干了接近3年的测试,今年年上旬,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了三年,…...
ipa如何安装到iphone
这里以目前很火的奥普appuploader为例,先打开 appuploader,把 iPhone 用原装数据线连接,点击左侧的 appuploader一栏,会在右窗格中看到机器的相关信息,可以看到是否越狱一栏显示“是”。 接下来请点击左侧的“程序库”…...
照片从安卓手机中消失了?让他们恢复回来的几个方法请收好
“我安卓上的所有照片都消失了,我的照片去哪儿了” “我安卓上的所有照片都不见了” “下载的图片从安卓上消失了” …… 您是否遇到类似的问题?导致Android手机照片丢失的原因有很多,例如软件更新、误删、误操作、系统崩溃、应用程序崩溃、…...
哪个年龄段人群喜欢养宠物?18-25岁占比最高,达31%
上一期,我们通过可视化互动平台分析了萌宠经济下宠物食品的发展现状,这一期我们接着来分析一下,在萌宠经济下,我国宠物医疗产业的市场情况。 由于现在很多家庭都喜欢饲养宠物,宠物数量的快速增长从而拉动了宠物经济的…...
使用Apache POI数据导出及EasyExcel进行十万、百万的数据导出
文章目录 Apache POI使用 EasyExcel工具类easyExcel工具类poi Apache POI Apache POI 是基于 Office Open XML 标准( OOXML )和 Microsoft 的 OLE 2 复合⽂档 格式( OLE2 )处理各种⽂件格式的开源项⽬。 简⽽⾔之,您可…...
八种故障排障思路
目录 生产故障有哪些 1、网络故障 如何发现网络故障 如何排查网络故障 如何解决网络故障 2、服务器故障如何处理 如何发现服务器故障 如何排查服务器故障 如何解决服务器故障 3、数据库故障如何处理 如何发现数据库故障 如何排查数据库故障 如何解决数据库故障 4…...
JavaScript全解析——this指向
本系列内容为JS全解析,为千锋教育资深前端老师独家创作 致力于为大家讲解清晰JavaScript相关知识点,含有丰富的代码案例及讲解。如果感觉对大家有帮助的话,可以【点个关注】持续追更~ this指向(掌握) this 是一个关…...
MySQL中ON DUPLICATE KEY UPDATE和REPLACE INTO区别
MySQL中的ON DUPLICATE KEY UPDATE和REPLACE INTO区别 在MySQL中,当我们需要插入新的数据到一个已存在的表中时,有两个常见的选项:ON DUPLICATE KEY UPDATE和REPLACE INTO。这两个选项可以解决类似的问题,但在处理重复键…...
37本国产SCI期刊推荐!涵盖9大领域,建议收藏!②
三、地学类 1. Acta Oceanologica Sinica | 国产之光!影响因子1分,中科院2区,国人占比81%! 评语:Acta Oceanologica Sinica在海洋学领域处于中等水平,影响因子逐年上升。近年来我国倡导发表国内期刊的论文…...
掌握无缝云迁移方法的数据集成
随着越来越多的组织过渡到基于云的基础架构,数据集成已成为云迁移过程的关键组成部分。数据集成包括将来自不同来源的数据集成到一个整合的视角中。云迁移的上下文涉及将数据从本地系统传输到基于云的平台,同时确保数据的一致性、准确性和可用性。 本文…...
unity 3种办法实现血条效果并实现3d世界血条一直看向摄像机
普通血条栏: 渐变色血条栏: 缓冲血条栏: 3D场景血条栏跟随玩家移动: 普通血条栏: 在Canvas下创建一个空物体HP bar,在空物体下方创建3个Image,分别为血条框bar 黑色,最大HP maxHP 白色,和当前HP currentHP 红色。(PS:注意先后顺序以调整显示的图层) 效果: …...
Jenkins流水线整合k8s实现代码自动集成和部署
一、前置条件 1、安装好k8s集群 这里先要搭建好一个K8s集群,笔者这边就采用使用了一个一主一丛的k8s集群,k8s集群的版本使用1.19.5版本,服务器的配置:2核4G,操作系统: CentOS Linux release 7.9.2009 (Core) 主机名…...
Sentinel-3B OLCI 3 级全球分箱地球观测降分辨率(ERR)叶绿素(CHL)数据,版本 2022.0
Sentinel-3B OLCI Level-3 Global Binned Earth-observation Reduced Resolution (ERR) Chlorophyll (CHL) Data, version 2022.0 简介 叶绿素 a 数据集提供全球网格化的表层叶绿素 a 浓度(浮游植物生物量的替代指标)合成数据。CHL 支持时间序列和气候…...
GEMM内核与MHA中的寄存器分配优化策略
1. GEMM内核与寄存器分配基础解析通用矩阵乘法(GEMM)作为深度学习计算的核心算子,其性能表现直接决定了神经网络训练和推理的效率。在硬件层面,寄存器分配的优劣往往能带来数倍的性能差异。我们以典型的GEMM运算C αAB βC为例&…...
2026 新视角:化妆品开发的底层逻辑,做好一款产品,从选对原料开始
在化妆品研发链条中,配方架构、生产工艺、包装设计固然重要,但决定一款产品上限的,永远是原料。一款稳定、安全、表现优异的护肤成品,离不开纯净、达标、批次一致的优质原料。对于品牌方、配方师、代工企业而言,原料不…...
第3篇:系统透视——信息部门如何构建“税务友好型”IT架构
本篇导读:如果你是信息总监或IT负责人,请通读全文,尤其是“系统合规设计的三必须”和“现场检查SOP”;如果你是财税人员,请重点阅读“研产供销全链条的系统对接要求”和“与IT部门的协作要点”;如果你是老板…...
网络配置工具类详解
CNet 网络配置工具类详解平台:仅支持 Linux,大量使用 ioctl 系统调用一、概述 CNet 是一个 纯静态方法的网络配置工具类,封装了 Linux 下常用的网络操作:功能类别涵盖内容IP 地址读取/设置本机 IP、子网掩码网关读取/添加/删除/设…...
FairyGUI Unity鼠标悬停与点击对象获取原理与实战
1. 这不是“加个OnMouseEnter就能用”的事:FairyGUI在Unity中处理鼠标交互的真实困境很多人第一次在Unity里集成FairyGUI,想实现“鼠标悬停显示提示”或“点击高亮当前按钮”,下意识就去翻Unity的MonoBehaviour文档,找OnMouseEnte…...
独立开发者如何利用Taotoken Token Plan,以更低成本启动AI项目
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 独立开发者如何利用Taotoken Token Plan,以更低成本启动AI项目 对于独立开发者或小型团队而言,启动一个集成…...
别再手动测模型了!用Simulink Test Manager实现自动化测试(附Excel表格配置详解)
从手动测试到智能验证:Simulink Test Manager全流程自动化实战指南 在模型开发的迭代过程中,工程师们常常陷入"修改-测试-记录"的循环泥潭。每次参数调整后,手动运行模型、记录数据、比对结果不仅消耗大量时间,更可能因…...
Unity/Unreal开发者必看:用手机和陀螺仪实验,5分钟搞懂万向节死锁(附避坑指南)
Unity/Unreal开发者实战指南:用手机陀螺仪5分钟破解万向节死锁当你调试第一人称视角时,角色突然卡在墙面无法转动;当无人机模型在俯冲90度时失控乱转——这些很可能都是万向节死锁(Gimbal Lock)在作祟。作为实时3D开发中最恼人的数学陷阱之一…...
DeepSeek重复代码识别失效了?5个被90%团队忽略的AST解析盲区及修复清单
更多请点击: https://codechina.net 第一章:DeepSeek代码重复检测失效的真相与影响 DeepSeek-R1 模型在代码理解任务中表现出色,但其内置的代码重复检测机制在特定场景下存在系统性失效。根本原因在于模型对语义等价但语法结构差异显著的代…...
