编程之美-得到无序数组中最大K个数

求无序数组之中最小的k个数 在无序数组中国找最小的k个数,一般有以下几种办法:   1.比较排序,然后找最小的k个数,时间复杂度下界为O(nlogn)   2.计数排序,时间复杂度可以做到O(n),但是要看具体的数据情况。也比较费空间。 以上做法都是把所有元素的个数排好序,但是我们只需要找到前k个最小的数,不要求所有数据有序。   3.遍历所有数据,找到最小的数。再遍历剩下的数,找第二小的数,如此遍历k次,时间复杂度 阅读详情

原文看这里:

题目描述:
问:有很多个无序的数,我们姑且假定他们各不相等,怎么选出其中最大的若干个数呢?
答:可以这样写:int array[100] 。。。
问:好,如果有更多的数呢?
答:那可以改为 int array[1000] ...
问:如果我们有很多的数,比如一亿个,怎么办?
答:我们可以写 float array[100000000] 。。。
问:这样的程序能编译运行吗?
答:嗯... 我没写过那么多的0 .....


以下是各种实现的代码,我们就不用1亿个数字测试了,如果真的有那么多,保存为文件,用InputStream一边读取,一边处理好了:

注意:代码里面的大部分for循环,都可以改成从InputStream进行读取,int[]参数也是一样。这样就可以处理大数据量了。
  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.List;
  4. /**
  5.  * 得到无序数组的最大的K个数据。
  6.  * 
  7.  * @author 老紫竹 java2000.net
  8.  */
  9. public class ArrayFind {
  10.   public static void main(String[] args) {
  11.     int[] arrNum = { 1, 5, 8, 3, 5, 87, 2, 5, 6, 8, 49, 5, 2, 26, 16, 33, 1, 36, 5, 65, 13, 3, 34,
  12.         24, 2, 36, 474, 4, 4 };
  13.     List<Integer> arr = new ArrayList<Integer>(arrNum.length);
  14.     for (int num : arrNum) {
  15.       arr.add(num);
  16.     }
  17.     List<Integer> arrBak = new ArrayList<Integer>(arr);
  18.     int k = 5;
  19.     find1(arr, k);
  20.     //
  21.     //
  22.     arr.clear();
  23.     arr.addAll(arrBak);
  24.     List<Integer> rtn = find2(arr, k);
  25.     for (int num : rtn) {
  26.       System.out.print(num + ",");
  27.     }
  28.     System.out.println();
  29.     //
  30.     //
  31.     arr.clear();
  32.     arr.addAll(arrBak);
  33.     find3(arr, k);
  34.     //
  35.     //
  36.     arr.clear();
  37.     arr.addAll(arrBak);
  38.     List<Integer> rtn4 = find4(arr, k);
  39.     for (int num : rtn4) {
  40.       System.out.print(num + ",");
  41.     }
  42.     System.out.println();
  43.   }
  44.   /**
  45.    * 标准排序算法。
  46.    * 
  47.    * @param arr
  48.    * @param k
  49.    */
  50.   public static void find1(List<Integer> arr, int k) {
  51.     Collections.sort(arr);
  52.     for (int i = arr.size() - 1; i > arr.size() - k - 1; i--) {
  53.       System.out.print(arr.get(i) + ",");
  54.     }
  55.     System.out.println();
  56.   }
  57.   /**
  58.    * 大小组分组方法。
  59.    * 
  60.    * @param S
  61.    * @param k
  62.    * @return
  63.    */
  64.   public static List<Integer> find2(List<Integer> S, int k) {
  65.     if (k <= 0) {
  66.       return new ArrayList<Integer>();
  67.     }
  68.     if (S.size() <= k) {
  69.       return S;
  70.     }
  71.     List<Integer>[] rtn = Partition(S);
  72.     List<Integer> Sa = rtn[0];
  73.     List<Integer> Sb = rtn[1];
  74.     List<Integer> R = find2(Sa, k); // 找大的一组里面最大的k个
  75.     if (Sa.size() < k) {// 如果大的分组不足,则加上小的一组里面不够的数量
  76.       R.addAll(find2(Sb, k - Sa.size()));
  77.     }
  78.     return R;
  79.   }
  80.   private static List<Integer>[] Partition(List<Integer> S) {
  81.     ArrayList<Integer> Sa = new ArrayList<Integer>();
  82.     ArrayList<Integer> Sb = new ArrayList<Integer>();
  83.     int p = S.get(0);
  84.     int element;
  85.     for (int i = 1; i < S.size(); i++) {
  86.       element = S.get(i);
  87.       if (element > p) {
  88.         Sa.add(element);
  89.       } else {
  90.         Sb.add(element);
  91.       }
  92.     }
  93.     if (Sa.size() < Sb.size()) {
  94.       Sa.add(p);
  95.     } else {
  96.       Sb.add(p);
  97.     }
  98.     ArrayList<Integer>[] rtn = new ArrayList[2];
  99.     rtn[0] = Sa;
  100.     rtn[1] = Sb;
  101.     return rtn;
  102.   }
  103.   public static List<Integer> find3(List<Integer> S, int K) {
  104.     double Vmin = 0;
  105.     double Vmax = 1000;
  106.     double delta = 0.5;
  107.     double Vmid;
  108.     while (Vmax - Vmin > delta) {
  109.       Vmid = Vmin + (Vmax - Vmin) * 0.5;
  110.       int count = 0;
  111.       for (int n : S) {
  112.         if (n >= Vmid)
  113.           count++;
  114.         if (count >= K)
  115.           break;
  116.       }
  117.       if (count >= K) {
  118.         Vmin = Vmid;
  119.       } else {
  120.         Vmax = Vmid;
  121.       }
  122.     }
  123.     for (int s : S) {
  124.       if (s > Vmin) {
  125.         System.out.print(s + ",");
  126.       }
  127.     }
  128.     System.out.println();
  129.     return null;
  130.   }
  131.   /**
  132.    * 使用一个长度为K的小列表。
  133.    * 
  134.    * @param S
  135.    * @param K
  136.    * @return
  137.    */
  138.   public static List<Integer> find4(List<Integer> S, int K) {
  139.     List<Integer> rtn = new ArrayList<Integer>(K);
  140.     for (int i = 0; i < K; i++) {
  141.       rtn.add(S.get(i));
  142.     }
  143.     Collections.sort(rtn);
  144.     int min = rtn.get(0);
  145.     int current;
  146.     for (int i = K; i < S.size(); i++) {
  147.       current = S.get(i);
  148.       if (current > min) {
  149.         rtn.remove(0);
  150.         rtn.add(current);
  151.         Collections.sort(rtn);
  152.         min = rtn.get(0);
  153.       }
  154.     }
  155.     return rtn;
  156.   }
  157. }

运行结果
474,87,65,49,36,
474,87,65,49,36,
87,49,36,65,36,474,
36,49,65,87,474,
求数组中最大的K个数 这是从编程之美中摘选的一个题目,解法十分的快速。详细的可以查看编程之美第二章数字之谜的第11小题。解法是书中的所提出的,但代码是笔者自己上机实现的。如有不完美之处,欢迎大家讨论及指正。 最容易想到的就是循环遍历数组K次求出最大的K个数。 这个算法有许多的缺点:第一点就是速度不够,它的时间复杂度中O(K*N),当数组很大时,不能全部加载到内存中,这个算法就不可行了。 这道题目还有两种比较优的 阅读详情

相关推荐

最强解析面试题:在无序数组中取最大的K个数「建议收藏!」

这是面试中最大概率会问的一道题,总结之前的面经,加上借鉴牛人的观点,总结如下:一、当无序数组元素个数数量级不高的情况下,对数组进行排序,如果用最快的排序快速排序,时间复杂度为O(nlogn),排序结束后取其前K个元素,时间复杂度为常量,总体时间复杂度为O(nlogn)。这是最容易想到的解决方法。但要求取前K个最大元素,并没有要求其有序,在上述方法中,是对数组所有元素进行了排序的,包括N-K、和K个元

魏小言的博客 3332

无序数组中找第K大的数_落花逐流水的博客_无序数组找k大

无序数组中找第K大的数_落花逐流水的博客_无序数组找k大

u011250186的博客 613

微信小店推客分销系统源码获取与自研开发全攻略(2025年最新版)

源码选择建议快速试错:选用开源项目(如启航系统),3天可上线基础功能长期布局:购买商业源码授权,重点定制分佣规则与UI交互完全自研:适合年GMV过亿的大型企业,需前置投入风控与合规设计行动清单注册微信开放平台账号,完成视频号机构认证下载开源项目代码,部署本地测试环境联系三家源码供应商,获取合规性审计报告设计三级分佣比例表,通过法律顾问合规审查通过以上路径,可高效构建合规、稳定、高转化的微信小店推客分销系统,抢占2025年视频号电商红利。

2401_85184777的博客 1286

【数据结构与算法】寻找无序数组中第K大的数

【数据结构与算法】寻找无序数组中第K大的数

u011250186的博客 1671

离线AI实战指南:本地部署大模型处理PDF/Word/Excel

离线AI是指在无网络、不上传数据前提下,于个人设备运行大语言模型并完成文档理解、多轮对话与代码辅助等任务的技术方案。其核心依赖本地模型推理、文档解析向量化和轻量级对话调度三大能力。随着Phi-3、Qwen2、Llama3等轻量化开源模型普及,以及Ollama、LM Studio等易用工具成熟,普通用户已可在主流笔记本上实现PDF摘要、合同比对、代码注释等真实办公场景。本文聚焦离线AI的硬件适配、模型选型、文件处理链路与知识库构建,尤其强调中文OCR支持、结构化文档提取与CPU/GPU混合推理优化,助力非开发

weixin_31968639的博客 498

SceneSplat

目标:训练一个网络,输入高斯参数 → 输出与自然语言空间对齐的特征。考虑到标注语义的 3DGS 数据有限,作者设计了。策略,让模型在无标签场景上学到有用表征。都有一个与自然语言对齐的语义特征。这是整个方法的第一步,目标是让。

weixin_61091146的博客 1285

无序数组中获取第k个最大数

假设数组为nums,其长度为length,大于0;k的取值总是合理的。 方法1:排序法 对数组进行排序,如果是正序,则取索引为 [length-k] 的值;如果是倒叙,则取索引为 [k-1] 的值。 方法2:选择排序法 将数组分为已排序和未排序两部分,每次从未排序中选择最大的元素,放到已排序部分的最末位置,只需进行k次操作,便可得到第k个大的元素,即索引为 [k-1] 的值。 方法3:分治法(借助快排思想) 从数组中随机选择一个数,将大于等于该数的放到该数的左侧,小于该数的放到该数的右侧。假设该数在调整之后

u011195883的博客 2400

SpringBoot+Flowable 6.8.0实战:5分钟搞定免登录流程图设计器

本文详细介绍了如何通过SpringBoot与Flowable 6.8.0深度整合,快速实现免登录流程图设计器的集成方案。通过排除默认安全配置、自定义安全策略和用户模拟服务,开发者可在5分钟内完成设计器的部署,适用于快速原型开发和企业内部工具搭建。

weixin_29204205的博客 280

寻找无序数组中第k大的数

对于一个无序的数组,怎样找到其中第k大的数呢?下面总结几种方法。1.直接排序法使用常见的归并排序、堆排序等算法对数组进行排序,然后找到第k大的数。排序算法的时间复杂度为O(nlogn),所以算法总的时间复杂度为O(nlogn)。// Simple C++ program to find k'th biggest element #include<iostream> #include<algorith

好记性不如烂笔头 1万+

智驾域控制器硬件架构:从接口丛林到算力核心的工程解码

本文深入解析了智驾域控制器硬件架构的设计挑战与工程实践。面对复杂的接口丛林,文章详细探讨了如何高效融合摄像头、雷达等多源传感器数据,并构建以多SOC为核心的强大算力平台。同时,文章强调了电源、时钟、散热等最小系统及车规级可靠性设计的关键作用,为工程师提供了从接口驯服到算力核心协同的完整硬件解码指南。

happy2的博客 484

萤石摄像头批量下载视频后FFmepg拼接

本文描述萤石摄像头,如何批量下载视频,然后把视频片段拼接为一个完整的视频,亲测有效。有问题,可以下面留言

烤鱼哥哥的博客 1202

《编程之美》-得到无序数组中最大K个数

问:有很多个无序的数,我们姑且假定它们各不相等,怎么选出其中最大的若干个数呢? 答:可以这样写:int array[100] …… 问:好,如果有更多的元素呢? 答:那可以改为:int array[1000] …… 问:如果我们有很多元素,例如1亿个浮点数,怎么办? 答:个,十,百,千,万……那可以写:float array [100 000 000] …… 问:这样的程序能编译运行么

zhangze_wancheng的专栏 2021

流体动力学仿真软件:Star-CCM+_(15).用户自定义函数与模型

用户自定义函数(User-Defined Functions, UDFs)允许用户编写自己的函数,并在仿真中调用这些函数。UDFs可以用于定义复杂的边界条件、源项、材料属性等。Star-CCM+支持多种编程语言,包括C++、Fortran和Java等,其中最常用的语言是Java。用户自定义模型(User-Defined Models, UDMs)允许用户在仿真中引入自定义的物理模型。这些模型可以用于描述流体行为、化学反应、多相流等复杂现象。Star-CCM+提供了丰富的API来支持UDMs的开发。

kkchenjj的博客 557

【编程之美】读书笔记:寻找最大的K个数[转帖]

问题:查找大量无序元素中最大的K个数。          解法一:该解法是大部分能想到的,也是第一想到的方法。假设数据量不大,可以先用快速排序或堆排序,他们的平均时间复杂度为O(N*logN),然后取出前K个,时间复杂度为O(K),总的时间复杂度为O(N*logN)+O(K).         当K=1时,上面的算法的时间复杂度也是O(N*logN),上面的算法是把整个数组都进行了排序,而

leo115的专栏 2039

某联达OA任意用户登录漏洞复现

由于`/WebService/Lk6SyncService/DirectToOthers/GetSSOStamp.asm`j接口未作限制,导致可以通过该接口调用`admin`的`cookie`值,通过对`LoginCredence`和`LoginTimestamp`的参数修改,进而实现任意登录进去系统.

千寻的博客 1589

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

无序数组最小的k个数

import java.util.*; public class KthNumbers { /*分析:先找到最大的第k个数 遍历原数组比k小的输出即可 * 利用优先级队列实现堆排序 * 现将前k个数存入队列中 * 然后从k+1~n遍历 和队列中最大的比较 如果小于最大值 说明这个数在k个数中 将最大值出列 将这个值加入队列 * 遍历结束 得到k个数中的最大值 遍历原数组将比最大值小的输

吴蕴强的博客 1311

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

寻找数组中最大的K个数

题目 编程之美上的寻找N个数中最大的前K数,给出了一种算法,我认为比较好: 算法是这样写的: 假设N个数存储在数组S中,我们从数组S中随机选出一个元素X,把数组分为两部分Sa和Sb.Sa中的元素都大于X,Sb中的元素都小于X,这时,有两种可能性: 1.Sa中元素的个数小于K,Sa中所有的数和Sb中最大的K-|Sa|个数(|Sa|指Sa中元素的个数)就是数组S中最大的K个数。 2.Sa中元

Boyhou 的专栏 1599

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

寻找数组最大K个数

1、问题描述 给定一个数组

Wallace 858

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

在一个数组中寻找最大的K个数,我们首先说一种非常简单的方法,利用快速排序中的分割算法,即我们经常看见的partition。这个函数会返回一个 int 类型的值,这个值代表的是前一半数字和后一半数字的分割点,前一半数字都小于等于后一半数字(递增排序),所以,我们只要找到相对应的分割点,即可以找到最大的K个数,或者最小的K个数,这就是利用线性方法可以完成任务的方法。      首先,给出函数声明:in

张勤一 1964

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

用于解决类似:10亿个浮点数,找出当中最大的10000个之类的问题。《编程之美》上一共五种解法:解法一:利用选择排序和冒泡排序,这两者的复杂度都属O(N*K)解法二:和STL中的nth_element(first, nth, last)思路一样。首先在[first, last)上寻找一个阈值(可采用三点中值法),根据这个阈值将[first, last)分成两段,前一段所有值都小于等于(或大于等于)阈值,后一段所有数都大于等于(或小于等于)阈值。如果阈值所在的位置>nth,则说明第nth个数在前半段,否则nt

cesc 938

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

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

602

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

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

飞扬的青春的专栏 1097

寻找最大的K个数

《编程之美》——寻找最大的K个数(P139) 解法一:寻找最大的K个数最容易想到的方法是排序然后找出最大的K个数,在这里快速排序和堆排序都是不错的选择,他们的平均时间复杂度都是O(N*logN)。 堆排序代码如下 #define LeftChild(i) (2*(i)+1) static void swap(ElementType *lhs, ElementType *rhs) { Ele

子同的专栏 1097
上一篇: 中兴面试题,数字数组按首位逐列打印
下一篇: 分享一个DB2 UDB Server的结构图
老紫竹
博客等级 码龄19年 1万+粉丝 1252原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值