题目:从100万个数里面找出10个最大的数。写出代码并分析复杂度。

分析:

拿出这组数据的前10个数构建一个小根堆(堆排序:升序排序10个数,先建一个大根堆,再将堆顶的最大值与最后一个值交换,这样不断循环直到排好序成为一个小根堆),这个堆将保存数据中最大的10个数,接下来遍历剩下的数据,遇到比堆顶元素小的元素直接跳过,遇到比堆顶元素大的,替换堆顶元素,再对堆进行维护(也就是排序的过程),当遍历完数组,堆中保存的就是最大的的10个元素。

复杂度:O(n)

维护长度为10的堆对于遍历大量数据可以忽略不计,所以复杂度为遍历的复杂度O(n)。

代码:

import java.util.Arrays;
public class Sort {public static void main(String[] args) {int[] arr = new int[1000000];for(int i=0;i<arr.length; i++){arr[i] = i+1;}int[] result = sort(arr,10);System.out.println(Arrays.toString(result));}public static int[] sort(int[]arr, int n){int[] result = new int[n];System.arraycopy(arr,0,result,0,n);//调整为大根堆for(int i=n-1; i>=0; i--){adjustDown(result,i,n);}//维护:成为小根堆maintainHeap(result);//遍历剩下的数据,维护小根堆for(int i=n; i<arr.length; i++) {if(arr[i] > result[0]){result[0] = arr[i];maintainHeap(result);}}return result;}/*** 维护小根堆* @param arr*/private static void maintainHeap(int[] arr) {int tmp = 0;int end = arr.length-1;while(end > 0){tmp = arr[0];arr[0] = arr[end];arr[end] = tmp;adjustDown(arr,0,end);end--;}}/*** 向下调整* @param arr* @param i*/private static void adjustDown(int[] arr, int i,int len) {int c = 2*i+1;//左孩子int tmp = 0;while(c<len){c = c+1<len ? (arr[c]<arr[c+1]?c+1:c):c;//最大孩子if(arr[c] >arr[i]){tmp = arr[c];arr[c] = arr[i];arr[i] = tmp;i=c;c=2*i+1;}else{break;}}}
}

从100万个数里面找出10个最大的数。写出代码并分析复杂度。相关推荐

  1. 如何从100万个数中找出最大的前100个数

    1.  算法如下:根据快速排序划分的思想  (1) 递归对所有数据分成[a,b)b(b,d]两个区间,(b,d]区间内的数都是大于[a,b)区间内的数  (2) 对(b,d]重复(1)操作,直到最右边 ...

  2. 从100万个数中找出最大的前100个数

    https://blog.csdn.net/cslbupt/article/details/65935577 1.算法如下:根据快速排序划分的思想 (1) 递归对所有数据分成[a,b)b(b,d]两个 ...

  3. 在存有10亿个数的文件中找到最大的100万个数

    这是<编程珠玑>中的一道题目.10亿个整数,假设每个整数需要四个字节,如果使用排序的话,需要大约4G的内存,现在的很多pc都没有多这么内存,更不用说作者那个年代. 我们借助最小堆来解决这个 ...

  4. 随机生成100万个数,排序后保存在文件中

    随机生成100万个数,存储在文件out1.txt中,使用内部排序完成,并重新储存在文件out2.txt中. (一)使用STL中的qsort函数进行操作: #include "stdio.h& ...

  5. 海量数据处理:在100亿个数中找出top 10000

    经典的TOP K问题,借助堆排序进行 前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小堆 ...

  6. 从10万个数中找10个最大的数

    对于这种题目,最普通的想法是先对这10万个数进行排序,然后再选取数组中前10个数,即为最后的答案,排序算法的时间复杂度不下于O(N lgN).最好的方法是建立一个最小堆. 算法描述: 我们首先取10万 ...

  7. 圆周率 π 小数点第 100 万亿数字是多少?Google 用 Debian 服务器给出了答案

    整理 | 苏宓 出品 | CSDN(ID:CSDNnews) π=3.1415926...... 想必学生时代,当提及背诵圆周率 π 小数点后面的个数时,很多人的胜负欲在悄然之间被激起,"只 ...

  8. 单机100万连接,每秒10万次请求服务端的设计与实现(一) - 前传

    因起 大概两年前,半途接手了一个项目,一个Python写的游戏服务器.倒腾倒腾弄上线后,在一台4核16G的服务器上,TPS不满百,平均响应延迟超百毫秒,勉强抗个500-1000人在线.慢的令人发指.业 ...

  9. 单机100万连接,每秒10万次请求服务端的设计与实现(三) - 变量共享、超线程与高性能队列

    简要构架 前文提到过一个框架性的服务器端架构思路,但没给出系统结构图,这里画个图吧,直观不少: M M M M M M 完成部分IO IO对象争用 M M M 网络IO 数据包分析线程 I/O队列 数 ...

  10. 垃圾代码还能出圈?手把手教你写垃圾代码,从入门到精通!

    全世界只有3.14 % 的人关注了 爆炸吧知识 转自:机器之心 参与:思 如果说到什么是好代码,我们肯定都能说出一堆规则,例如使用一致的格式和缩进.使用清晰的变量名和方法名.在必要时提供文档与注释.不 ...

最新文章

  1. News Distribution
  2. 5.Qt自定义Button按钮的实现
  3. RabbitMQ死信实战(生产者)
  4. java access 分页查询语句,爱不释手—几条常见的数据库分页之SQL语句代码
  5. 大学留级两年不敢和家人说_您说什么:如何与家人保持联系?
  6. 算法(7)-leetcode-explore-learn-数据结构-数组-小结
  7. git config设置用户名_git从安装到多账户操作一套搞定(二)多账户使用
  8. BZOJ 3053 The Closest M Points
  9. 关于MPLS静态 LSP建立的问题——针对上题的另一种解法
  10. 4.GitLab 邮件配置
  11. sql server怎么设置id字段自增
  12. DBC连接数据库经验技巧
  13. 宝塔Inode信息使用率100%满了怎么清理?
  14. Python列表(list)练习题
  15. [每日一氵]Latex 的通讯作者怎么搞
  16. 【Java基础】Java综合练习
  17. 整合腾讯云地图的绘制和编辑几何图形
  18. 华为云14天鸿蒙设备开发培训Day3:快速入门
  19. 【数据结构——图和图的存储结构】
  20. idea注释设置和注释格式

热门文章

  1. [读书] 开放的智力
  2. Python练习册0-9
  3. JAVA小白 编程练习题
  4. 在MongoDB中使用JOIN操作
  5. 硅谷洞察发布《2019美国医疗信息化产业分析及趋势报告》
  6. 浏览器你为什么要干掉我的请求?
  7. POJ 2528 线段树离散化
  8. 课外读物感悟-第一周
  9. Java多线程:多人过山洞
  10. 程序员一定要知道的10个网站,记得收藏