编程之美 -- 2.5 寻找最大的K个数(堆排序方法)

Java实现寻找最小的k个数 1 问题描述 有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低。 2 解决方案 2.1 全部排序法 先对这n个整数进行快速排序,在依次输出前k个数。 package com.liuzhen.array_2; public class SearchMinK { //方法1:全部排序 public void quickSort(int[] A,int start,int e... 阅读详情

题目描述

寻找N个数字中最大的K个数字


package chapter_2_binary;

import java.util.Scanner;

/**
 * @author LiangGe
 *
 * 寻找一批数字中最K大数
 *
 * 前K个元素,建立小顶堆,之后每个元素和堆顶元素比较
 * 
 */
public class question_2_5_3 {
	
	public static void swap(int[] data, int i, int j) {
		int tmp = data[i];
		data[i] = data[j];
		data[j] = tmp;
	}
	
	public static void keepMinHeap(int[] data, int top, int len) {
		int curTop = top;
		for(int i=curTop*2+1; i<=len;) {
			if(i < len && data[i+1] < data[i]) {
				i ++;
			}
			if(data[i] < data[curTop]) {
				swap(data, i, curTop);
			}
			curTop = i;
			i = curTop * 2 + 1;
		}
	}
	
	public static void buildMinHeap(int[] data, int len) {
		int end = (len - 1) / 2;
		for(int i= end; i>=0; i--) {
			keepMinHeap(data, i, len);
		}
	}
	
	public static void findKthBigest(int[] data, int k) {
		buildMinHeap(data, k-1);
		for(int i=k; i<data.length; i++) {
			if(data[i] > data[0]) {
				swap(data, i, 0);
				keepMinHeap(data, 0, k-1);
			}
		}
	}
	
	public static void main(String args[]) {
		Scanner scanner = new Scanner(System.in); 
		int num = scanner.nextInt();
		scanner.nextLine();
		
		while(num -- > 0) {
			int n = scanner.nextInt();
			int k = scanner.nextInt();
			
			scanner.nextLine();
			String string = scanner.nextLine();
			String[] strs = string.split(" ");
			int[] data = new int[strs.length];
			
			for(int i=0; i< data.length; i++) {
				data[i] = Integer.parseInt(strs[i]);
			}
			
			findKthBigest(data, k);
			
			for(int i=0; i< k; i++) {
				System.out.printf("%3d", data[i]);
			}
		}
	}
}


总结 -- 寻找最大的K个数,寻找第K大的数 一、在N个数中,寻找最大的K个数 这里只考虑K不等于1的情况,K = 1时,可以通过N - 1次比较和交换得到结果。   1. N不大的情况下,几千个左右。 ① 先排序,快速排序或者堆排序,平均复杂度为O(N*log2N),再取出前K个,O(K)。总时间复杂度,O(N*log2N) + O(K) =O(N*log2N) ;    ② 若K 2N,可以进行部分排序(选择排序和冒泡排序)。 阅读详情

相关推荐

数据结构学习笔记5-寻找最小的k个数(选择排序和堆排序)

本文摘自《寻找最小的k个数》题目描述输入n个整数,输出其中最小的k个。

小小小的骆驼的前端技术博客 1021

面试-堆排序(heapSort)以及最大/小的k个数-java实现

Q: 同学面试腾讯的时候被问到:王者荣耀用户上亿,如何快速的从亿级数据量中找出排名榜首的几位玩家? A: 对于这种数据量比较大的情况,堆排序比较合适,而且堆排序每一轮可以找出当前数据中最大(大顶堆)或最小(小顶堆)的数,所以对于以上问题,用堆排序是不错的选择。 以找出输入数据中【最小的k个数】为例,java实现如下: package com.sap.stone; import java.util...

付石头的博客 805

百度地图小区边界爬取

百度地图 小区边界爬取 完整项目地址-github 数据源:百度地图api 项目结构 RESIDENTIALAREABOUNDARY │ ResidentialAreaBoundaryControl.py 主函数 │ ResidentialAreaBoundaryFunc.py 方法库 │ ├─Auxiliary │ crawelFunc.p...

fulin9452的博客 6399

堆排序(寻找数组中第K个最大的数)

堆排序理解 1、建立大顶堆,从最后一个非叶子节点开始。 2、具体过程:用根结点介绍(方便理解写代码): 调整根节点 观察1的动向,我们可以知道,调整一个一般非叶子节点的位置,我们需要多次重复操作。 操作一个非叶子节点的停止条件,左右子节点都比其父节点要小,或者仅有左节点且比父节点小,或者没有子节点了。 我们要从最后一个非叶子节点一直这样调整,直到根节点 下面粘代码: class Solution { public: int findKthLargest(vector<int>&amp

小菜鸟sha的博客 1511

实战!在 AMD RX 9070 XT (16G) 上使用原生 Windows ROCm 7.1 部署 ComfyUI + Z-Image-Turbo

本文详细介绍了如何在Windows系统下为AMD Radeon RX 9070 XT显卡配置Z-Image-Turbo AI绘图环境。主要内容包括:安装VS Build Tools和最新显卡驱动,配置Conda Python 3.12环境,安装ROCm 7.1.1 SDK及PyTorch适配版本,部署ComfyUI可视化界面。重点解决了AMD显卡在AI绘图中的适配问题,通过--use-split-cross-attention参数优化显存使用,最终成功搭建了可在消费级16G显存设备上运行的AI绘图环境

qq_33614778的博客 4673

资金穿透分析

我们把准备好的银行数据导入到软件中,导入具体步骤这里不做详解,大家可以通过“清林情报分析师”公众号,查看操作视频第二节

清林情报分析师 3489

用堆排序寻找数组中最大的K个数

/*********************************************************************************** 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。 堆积是一个近似完全二叉树的结构,并同时满足堆积的性质: 即子结点的键值或索引总是小于(或者大于)它的父节点。 通常堆是通过一维数组来实现的。在起始数组为 0

聚精会神搞建设 4301

手把手教你学simulink(12.10)--设计和仿真一个用于控制飞机纵向运动(高度和速度)的多变量控制系统

飞机的纵向运动控制是航空工程中的一个重要问题,涉及飞机的高度和速度的精确控制。多变量控制系统可以同时控制多个飞行参数,确保飞机在最佳条件下运行。Simulink提供了一个强大的平台,用于建模、仿真和分析动态系统,非常适合设计和测试多变量控制系统。通过本项目的实施,我们成功设计和仿真了一个用于控制飞机纵向运动(高度和速度)的多变量控制系统。该项目展示了从系统建模、控制器设计、仿真验证到结果分析的完整流程,为多变量控制系统的设计提供了有价值的参考。

MHD0815的博客 597

编程之美读书笔记(4)寻找最大的K个数

问题: 有很多无序的数,从中找出最大的K个数。假定他们都不相等。 解法一: 如果数据不是很多,例如在几千个左右,我们可以排一下序,从中找出最大的K个数。排序可以选择快速排序或者堆排序 #include #include int cmp(const void *a,const void *b){ return *(int *)a - *(int *)b; } int main(){

落日小屋 3713

基于STM32、HAL库的MPX5500DP气压传感器 驱动程序设计

define MPX5500DP_MIN_VOLTAGE 0.2f // 最小输出电压(V)#define MPX5500DP_MAX_VOLTAGE 4.7f // 最大输出电压(V)#define MPX5500DP_MIN_PRESSURE 0.0f // 最小压力(kPa)#define MPX5500DP_MAX_PRESSURE 500.0f // 最大压力(kPa)* @brief 读取压力值(kPa)// 计算压力值 (线性转换)

corlin6688的博客 196

基于uniapp开发PDA扫码枪APP:实现RFID批量扫描读取功能

基于uniapp的PDA扫码枪APP开发实战,实现高效RFID读取功能,uniapp整合PDA硬件的实践分享,基于uniapp的PDA端RFID批量扫描方案开发

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 1万+

找出N个数据中的最大的K个数据---堆排序

从N个数据中找出最大的K个数据,而且这里有一个限制:内存里存不下所有的N个数据,但是可以存下K个数据。这就让我们打消了用排序的方法来解的念头。 在这里我们使用堆排序来完成。 因为我们只能有K个数据那么大的空间,所以我们建一个K大的堆,将N的前K个数据插入到堆中,然后调整堆。(对于堆结构不了解的可以查看我微博 http://helloleex.blog.51c...

weixin_34378045的博客 559

引文:当SVM转角遇上Copy-on-Write (COW)

本文分析了Linux内核中fork系统调用的Copy-on-Write(COW)机制实现原理。重点阐述了fork时父子进程共享物理页面、标记页表项为只读并在写操作时触发COW的流程,以及在SVM环境中通过MMU Notifier机制保持CPU和GPU页表同步的解决方案。文章详细描述了COW的三个阶段:初始共享、写入触发和页面复制,并说明了MMU Notifier的回调注册和处理流程,确保异构计算环境下内存一致性。

图形/计算GPU的驱动与虚拟化技术分享园地 2661

《编程之美》——寻找最大的K个数

题目: N个无序的数(可能数目非常大),选出其中最大的K个数。分析与解法:【解法一】 对N个数进行排序,然后选出最大的K个数。可以使用快速排序或堆排序,时间复杂度为O(NlogN)。 因为这里N的数目可能非常大,即N>>K,而前N-K个数可以不进行排序,使用可以部分排序的算法,如选择排序或交换排序,时间复杂度为O(NK)。【解法二】 当N的数值很大的时候,即N>>K。可以使用快速排序中的pa

zengzhen_优快云的博客 3299

【YOLOv11改进- 主干网络】YOLOv11+RepViT: 从ViT的角度重新审视Mobile的CNN助力YOLOv11有效涨点;

本文给大家带来的改进内容是在YOLOv11中更换主干网络为RepViT,助力YOLOv11有效涨点,论文通过集成轻量级 ViT 的高效架构设计,逐步增强了标准轻量级 CNN(即 MobileNetV3)的移动友好性。这最终产生了一个新的纯轻量级 CNN 系列的主干网络。

qq_41304809的博客 785

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

[编程之美] 2.5 寻找最大的K个数

从一串数字中寻找最大的K个数,而且考虑数据量比较大的情况。

追寻梦想的青春 1577

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

编程之美读书笔记_2.5 寻找最大的K个数

2.5 寻找最大的K个数从n个数中寻找最大的k个数,两种思路:1 保存目前找到的最大k个数,每访问一个数,就与这k个数中的最小值比较,决定是否更新这k个数。储存k个数的数据结构可采用:败者树、二叉查找树、最小堆。C++ STL提供了multiset和priority_queue容器,另外还提供了make_heap,push_heap,pop_heap方便手动构建堆结构。(测试发

flyinghearts的专栏 2731

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

编程之美_2.5_寻找最大的k个数

题目描述:输入n个整数,输出其中最大的k个。 举例:输入序列1、2、3、4、5、6、7、8,输出最大的4个数字为5、6、7、8。 可能存在的条件限制: 要求 时间 和 空间消耗最小、海量数据、待排序的数据可能是浮点数等 方法一:对所有元素进行排序,之后取出前K个元素,不提倡使用 思路:使用最快排序算法,选择快排 或 堆排 时间复杂度:O(n*logn) + O(K) = O(n*log

思考,思考,再思考~ 7481

编程之美系列之寻找最大的K个数

编程之美之第二章第5小节,即寻找最大的K个数。

Juery_Lee的专栏 682

《编程之美》2.5寻找最大的K个数

问题:有很多个无序的数(假设为N个),怎么选出其中最大的K个数? Kays word:kay的理解:“很多” == 好多好多,无法存储,因此首先排除了对输入数排序的解法,而采用小容量数组整理大的输入数据,即:开大小为K的数组,通过遍历N个输入数组,每遍历一个数num,检查K数组的最小数,如果比num小,则用num替换。最终完成K个最大数的提取。代码如下:#include

602

[编程之美] PSet2.5 寻找最大的K个数

   问题:查找大量无序元素中最大的K个数。姑且假定它们

飞扬的青春的专栏 1097

编程之美 寻找最大的K个数

有很多个无序数,我们姑且假定他们各不相等,怎么挑选出其中最大的若干个数呢?         如果这个数据量很大,比如1亿个,如果所存数据是浮点型呢?我们该怎么处理呢? 分两部分,第一部分是我个人的解答,第二部分是书上的解答; 第一部分:     1,如果这个问题里的数据都是整数,这个问题利用hash映射应该很简单,就是在开辟一个数组,把原数组里的数据map到新开辟的数组里,如:原数

cike211的专栏 811

编程之美之2.5 寻找最大的K个数

【题目】 有很多无序的数,从中找出最大的K个数。假定他们都不相等。 【解法一】 如果数据不是很多,例如在几千个左右,我们可以排一下序,从中找出最大的K个数。排序可以选择快速排序或者堆排序 [cpp] view plaincopy #include   #include   int cmp(const void *a,const

SmartSi 9347

编程之美 读书笔记(寻找最大的k个数)

实际的情况我觉得往往要考虑到数的范围,数的特点(整数还是浮点,重复多不多)以及K与数组长度N的比例关系,数组长度N是否超出内存大小等等因素。 问题:有很多无序的数,姑且假定它们各不相等,怎么选出其中最大的若干个数呢? 实际可能的应用场景 1从1亿个qq号码中选出最值钱的5000个 2从2亿张图片中选出点击率最高的100张 算法一: 直接选择排序、冒泡排序 时间复杂度: o(N^2)

xdgs_2005的专栏 478

编程之美2:寻找最大的K个数

根据楼楼参加笔试或者面试的经验而言,寻找最大的K个数这个问题,被问到已经不只两三次了,所以楼楼决定认认真真地把这个问题写一下,解法思想参照《编程之美》一书。题目简介有很多无序的数,我们姑且假定他们各不相等,怎么选出其中最大的K个数呢?相关知识点排序题目解答解法一:直接排序这个解法是第一反应,假设有N个数,我们使用一个N个长度的数组将其存储下来,并且使用排序算法将其从大到小依次排列。排序完成后,输出前

XIAXIA__的专栏 2178

寻找最大的K个数

寻找最大的K个数 解法1:在元素数量不大的情况下,采用快排或者堆排序对所有元素排序,取前K个,时间复杂度为O( N*logN )+O( K )= O( N*logN ); 采用部分排序算法,如选择排序或交换排序,把N个数中的前K个数排序出来,复杂度为O( N*K ); 具体选择取决于K与logN的大小。 解法2:按照快速排序的思路,假设N个数存储在数组S中,从数组S中随机找出一个元素X,把数组

我的读书笔记(2011-2013) 810
上一篇: 编程之美 -- 2.5 寻找最大的K个数(快排方法)
下一篇: 编程之美 -- 2.7 最大公约数问题
java_wliang
博客等级 码龄15年 19粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值