1 /**
 2  * 找到无序数组中最小的k个数 时间复杂度O(Nlogk)
 3  * 过程:
 4  * 1.一直维护一个有k个数的大根堆,这个堆代表目前选出来的k个最小的数
 5  *     在堆里的k个元素中堆顶的元素是最小的k个数中最大的那个。
 6  * 2.接下来,遍历整个数组,遍历过程中看当前数是否比堆顶元素小:
 7  *     如果是,就把堆顶元素替换成当前的数,然后从堆顶的位置调整整个堆,让替
 8  *     换操作后堆的最大元素继续处在堆顶的位置;
 9  *     如果不是,则不进行任何操作,继续遍历下一个数;
10  * 3.在遍历完成后,堆中的k个数就是所有数组中最小的k个数
11  */
12 public class getMinKNumsByHeap {
13
14     public int[] getMinKNumsByHeap(int[] arr, int k) {
15         if (k < 1 || k > arr.length) {
16             return arr;
17         }
18         int[] kHeap = new int[k];
19         for (int i = 0; i < k; i++) {
20             heapInsert(kHeap, arr[i], i);
21         }
22         for (int i = k; i != arr.length; i++) {
23             if (arr[i] < kHeap[0]) {
24                 kHeap[0] = arr[i];
25                 heapify(kHeap, 0, k);
26             }
27         }
28         return kHeap;
29     }
30
31     // 建堆的过程
32     private void heapInsert(int[] arr, int value, int index) {
33
34         arr[index] = value;
35         while (index != 0) {
36             int parent = (index - 1) / 2;
37             if (arr[parent] < arr[index]) {
38                 swap(arr, parent, index);
39                 index = parent;
40             } else {
41                 break;
42             }
43         }
44     }
45
46     // 调整堆的过程
47     private void heapify(int[] arr, int index, int heapSize) {
48
49         int left = index * 2 + 1;
50         int right = index * 2 + 2;
51         int largest = index;
52         while (left < heapSize) {
53             if (arr[left] > arr[index]) {
54                 largest = left;
55             }
56             if (right < heapSize && arr[right] > arr[largest]) {
57                 largest = right;
58             }
59             if (largest != index) {
60                 swap(arr, largest, index);
61             } else {
62                 break;
63             }
64             index = largest;
65             left = index * 2 + 1;
66             right = index * 2 + 2;
67         }
68     }
69
70     // 交换
71     public void swap(int[] arr, int index1, int index2) {
72         int tmp = arr[index1];
73         arr[index1] = arr[index2];
74         arr[index2] = tmp;
75     }
76 }

转载于:https://www.cnblogs.com/qinwangchen/p/6106398.html

【算法】数组与矩阵问题——找到无序数组中最小的k个数相关推荐

  1. 找出无序数组中最小的k个数(top k问题)

    2019独角兽企业重金招聘Python工程师标准>>> 给定一个无序的整型数组arr,找到其中最小的k个数 该题是互联网面试中十分高频的一道题,如果用普通的排序算法,排序之后自然可以 ...

  2. 小米笔试题:无序数组中最小的k个数

    题目描述 链接:https://www.nowcoder.com/questionTerminal/ec2575fb877d41c9a33d9bab2694ba47?source=relative 来 ...

  3. 窥探算法之美妙——寻找数组中最小的K个数python中巧用最大堆

    原文发表在我的博客主页,转载请注明出处 前言 不论是小算法或者大系统,堆一直是某种场景下程序员比较亲睐的数据结构,而在python中,由于数据结构的极其灵活性,list,tuple, dict在很多情 ...

  4. 寻找数组中最小的k个数(快排和堆排)

    题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 思路1:利用快排的思想,寻找第k个位置上正确的数,k位置前面的数即 ...

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

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

  6. 数据结构与算法--最小的k个数

    最小的k个数 题目:输入n个整数,找出其中最小的k个数,例如输入4,5,6,7,8,9这六个数字,则最小的4个是4,5,6,7 方案一 还是最直观的方法,先排序,最快的是快排O(nlog2n),然后遍 ...

  7. c语言从4个整数中找最小的数,编程之法:面试和算法心得(寻找最小的k个数)...

    内容全部来自编程之法:面试和算法心得一书,实现是自己写的使用的是java 题目描述 输入n个整数,输出其中最小的k个. 分析与解法 解法一 要求一个序列中最小的k个数,按照惯有的思维方式,则是先对这个 ...

  8. 找出无序数组最小的K个数(基于快排,效率高)

    快排: void QuickSort(int array[], int low, int high) { if (low >= high) //为了防止无限递归下去,导致栈溢出,设置此条件 { ...

  9. 《剑指offer》-- 数组中的逆序对、最小的K个数、从1到n整数中1出现的次数、正则表达式匹配、数值的整数次方

    一.数组中的逆序对: 1.题目: 数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出 ...

最新文章

  1. 实验四 JSP数据库编程基础
  2. python导入词云包失败:ImportError:cannot import name ‘WordCloud’
  3. vue 自己写上传excel组件_vue结合elementui组件 el-upload 上传excel表格(二)
  4. 黑马Go语言与区块链学习笔记
  5. QMouseEvent 的坐标__Win
  6. html超文本链接本页面,从HTML语言到网上家园 第三章 超文本链接(1)-网页设计,HTML/CSS...
  7. 他不怕被拒绝_不会敬酒很吃亏,送你五个敬酒词的模版,再也不怕劝酒了
  8. java string.format_如果性能很重要,我应该使用Java的String.format()吗?
  9. 如何产生好的词向量?
  10. 16.凤凰架构:构建可靠的大型分布式系统 --- 向微服务迈进
  11. 时间序列分析与非参数统计
  12. 色彩特征提取-色彩属性HSV空间
  13. PDF如何编辑,怎么删除PDF页眉页脚
  14. 打包Hololens2 VS error MSB3774: 找不到 SDK“WindowsMobile, Version=10.0.19041.0”解决办法
  15. elixir元编程的quote与unquote
  16. Win10自带的录屏功能怎么用?
  17. UnicodeDecodeError: 'utf-8' codec can't decode byte 0xca in position 491: invalid continuation byte
  18. 电路设计实例(防止DC电源反接的方法)
  19. windows扩充C盘容量(删除Ubuntu分区)
  20. python键盘上下左右控制_python方向键控制上下左右代码

热门文章

  1. 2018年最实用机器学习项目Top 6(附开源链接)
  2. 带你自学Python系列(二):Python列表总结-思维导图
  3. VScode Remote 远程开发与调试(转)
  4. Matlab线性/非线性规划优化算法(2)
  5. ios kvo 要引入_iOS多线程之超实用理论+demo演示(可下载)
  6. 向程序发送命令失败_java程序员进阶:Redis分布式技术问题集锦
  7. python路径拼接os.path.join()函数完全教程_详解python路径拼接os.path.join()函数的用法...
  8. mysql 从 a表updateb表_mysql A表自动更新和插入B表的数据
  9. 华为鸿蒙系统学习笔记3-方舟编译器介绍
  10. wordpresd免登录发布接口php_屏蔽修改wp-login.php登录入口确保WordPress网站后台安全...