堆排序与取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) 主机名…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...
海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》
近日,嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,海云安高敏捷信创白盒(SCAP)成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解…...
Java数组Arrays操作全攻略
Arrays类的概述 Java中的Arrays类位于java.util包中,提供了一系列静态方法用于操作数组(如排序、搜索、填充、比较等)。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序(sort) 对数组进行升序…...
虚幻基础:角色旋转
能帮到你的话,就给个赞吧 😘 文章目录 移动组件使用控制器所需旋转:组件 使用 控制器旋转将旋转朝向运动:组件 使用 移动方向旋转 控制器旋转和移动旋转 缺点移动旋转:必须移动才能旋转,不移动不旋转控制器…...
SFTrack:面向警务无人机的自适应多目标跟踪算法——突破小尺度高速运动目标的追踪瓶颈
【导读】 本文针对无人机(UAV)视频中目标尺寸小、运动快导致的多目标跟踪难题,提出一种更简单高效的方法。核心创新在于从低置信度检测启动跟踪(贴合无人机场景特性),并改进传统外观匹配算法以关联此类检测…...
