package com.alo.offer;import java.util.Scanner;/*** n个数中找到最小的m个数 使用大顶堆* n个书中找到最大的m个数 使用小顶堆* @author Administrator**/
public class MaxHeap {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int k = sc.nextInt();MaxHeap mh = new MaxHeap(k);for(int i=0;i<n;i++) {mh.add(sc.nextInt());;}int []rs = mh.getData();for(int i:rs) System.out.print(i+" ");sc.close();}private int [] a ;public MaxHeap(int k){this.a = new int[k+1]; //下标从1开始for(int i=1;i<=k;i++) {this.a[i]= Integer.MAX_VALUE;}}public int getLength() {return a.length;}public int left(int i) {return i<<1;}public int right(int i) {return (i<<1)+1;}public void add(int e) {if(e<a[1]) { //如果比大顶堆的最大数小的话,将其添加到堆中a[1]=e;adjustHeap(1);}}private void adjustHeap(int root) {// TODO Auto-generated method stubint l=this.left(root); int r =this.right(root);int max =root;if(l<this.getLength()&&a[l]>a[max])max=l;if(r<this.getLength()&&a[r]>a[max])max=r;//root的左右孩子和自己比较,找到当中值最大的下标,如果就是root的话,那么不用进行调整,否则,root和最大的值交换;if(max==root) {                          //然后递归判定交换后的下标作为根节点,是否符合root最大的条件return;}swap(root,max);this.adjustHeap(max);}private void swap(int root, int max) {// TODO Auto-generated method stubint temp =a[root];a[root]=a[max];a[max]=temp;}public int [] getData() {return this.a;}
}

大顶堆,n个数中找最小的k个数相关推荐

  1. [剑指 offer]--大顶堆 ➕ 快速选择 --面试题40. 最小的k个数

    1 题目描述 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:arr = [3,2,1], ...

  2. topK问题——N个数中取最大的K个数

    topK问题 在海量数据中找出出现频率最高的前k个数,或者从海量数据中找出最大的前k个数,这类问题通常被称为topK问题. N个数中取最大的K个数,用小根堆:N个数中取最小的K个数,用大根堆:时间复杂 ...

  3. 面试题:从n个数中找出第K大的数

    参考https://blog.csdn.net/orangefly0214/article/details/84997668的思路 从有n个元素的乱序数组中找出第k大的元素 方法1:基于冒泡排序和简单 ...

  4. Python从N个数中找到最大的K个数

    提出问题: 如何在某集合里面找出最大或最小的K个元素. 解决思路: 找出最大或最下的K个元素,可以使用Python库中的heapq模块,该模块提供两个函数nlargest()求最大K个和nsmalle ...

  5. 大顶堆和小顶堆-java

    一.大顶堆和小顶堆的原理 1.大顶堆 根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大顶堆.大根堆要求根节点的关键字既大于或等于左子树的关键字值,又大于或等于右子树的关键字值. 2.小 ...

  6. 用大顶堆取出一个数组中最小的k个数

    eg:从一亿个数中取出最小的k个数字 分析: 大顶堆满足,当前元素永远大于他的左右子树的值,非叶子节点的下标为n/2-1,左子树下标为i*2+1右子树下标为i*2+2 源码: import java. ...

  7. 从一亿个数中找出最大的一万个数或最小的一万个数

    1 从一亿个数中找出最大的一万个数:(前10000个元素构建最小堆,后续元素与根节点比较,大于放进去,小于或等于不处理) 用前一万个数初始化一个固定大小为10000的最小堆,这时根节点是这10000个 ...

  8. [剑指offer][JAVA][面试第40题][最小的k个数][快选][堆][BST]

    [问题描述]面试第40题 最小的k个数 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 : 输入:arr ...

  9. java笔试题:海量数据找最大或最小的k个数(堆排序)

    题目 海量数据找最大或最小的k个数,这里以找最小的K个数为例 堆排序 例如给一个数组nums[]这棵树就是完全二叉树,则: nums[i]的左节点为:num[2 * i + 1] nums[i]的右节 ...

最新文章

  1. python检测英文拼写错误
  2. 我长了一条日本制的尾巴:智能配合身体运动,增强平衡感,把我变成“改造人”| SIGGRAPH...
  3. springboot配置文件加载位置
  4. minheight能继承吗_CSS 哪些属性默认会继承, 哪些不会继承?
  5. 【C语言】while后接分号“ ;”的用法
  6. 6-3 二叉树的重建 uva536
  7. python--文件
  8. shell变量、函数和数组以及字符串的截取
  9. Android ListView自定义分割线 header 和footer设置没有页眉和页脚
  10. wr703n 4m固件 带打印机服务器_旗捷支招 | 如何关闭打印机固件自动更新?分分钟搞定!...
  11. 春节挣一波快钱,Top 19 接私活平台
  12. MySQL 5.7详细下载安装配置教程
  13. deepin安装教程(deepin安装教程不用u盘)
  14. 23.2.7 点亮三个灯
  15. 基于JSP+Mysql java教师教学质量测评系统
  16. 轻松几步获得上万点击率(三)
  17. Python实现将多张图片拼接为一张
  18. 计算机网络专题讲座,我院举行《计算机网络新技术》专题讲座
  19. matlab编程 利用生成一个10阶魔方矩阵,求矩阵的特征值、特征向量,对于特征值,请按照降序进行排列,对应的特征向量进行同样的排序。...
  20. 让我们一起打起FPGA工程师就业保卫战

热门文章

  1. Linux系统和内核目录解析
  2. 递推计算小白兔拔萝卜问题的最有矩阵
  3. textpad和masm搭建汇编环境
  4. vs为什么打了断点不断_2019年亚洲羽毛球锦标赛决赛焦点对阵:桃田贤斗VS石宇奇 松本麻佑/永原和可那VS陈清晨/贾一凡 山口茜VS何冰娇...
  5. 林纳斯·托瓦兹(Linus Torvalds)为什么被称作大神?
  6. ZUCC_计算机网络实验_实验01 实验一RJ45原理与制作
  7. CMS垃圾收集器详解
  8. 疫情期间居家所需物品清单
  9. CS、BS架构定义(笔记)
  10. [bzoj3698]XWW的难题——有上下界的最大流