数组中找出最小的K个数

题目

给出一个数组,找出K个最小的值

例如给出数组{5,2,4,3,1},给定K值3,则输出结果为{2,3,1}

程序

先给出第一个版本的程序

 1     public static void printKNum(int[] source, int k) {//算法入口
 2         if (k <= 0) {
 3             System.out.println("请出入合法的K值");
 4         } else if (source.length <= k) {//如果数组的长度小于等于K,则全部输出
 5             System.out.println(Arrays.toString(source));
 6         } else {
 7             int size = 1;//记录链表的长度
 8             Node end = new Node(source[0]);
 9             for (int i = 1; i < source.length; i++) {//迭代N次
10                 if (source[i] < end.value) {//如果值小与最后一个的value,则进行插入到列表的操作
11                     findSideAndInsert(source[i], end);
12                     size++;
13                     if (size > k) {
14                         end = end.last;
15                     }
16                 }
17             }
18             end.printLastAll();
19         }
20     }
21
22     private static void findSideAndInsert(int value, Node end) {//迭代K次,且列表有序
23         if (end.last == null) {
24             end.last = new Node(value);
25         } else {
26             if (value < end.last.value) {
27                 findSideAndInsert(value, end.last);
28             } else {
29                 Node current = new Node(value);
30                 current.last = end.last;
31                 end.last = current;
32             }
33         }
34     }
35
36     private static class Node {
37         int value;
38         Node last;
39
40         public Node(int value) {
41             this.value = value;
42         }
43
44         public void printLastAll() {
45             System.out.println(this.value);
46             if (last != null) {
47                 this.last.printLastAll();
48             }
49         }
50     }
时间: 2024-10-25 03:38:32

数组中找出最小的K个数的相关文章

C语言 选择排序算法原理和实现 从数组中 找出最小的元素然后交换位置

#include <stdio.h> int main(void) { /* 选择排序算法 原理:从数组中 找出最小的元素然后交换位置: */ int a[10] = {9,5,10,7,2,3,1,6,8,4}; int i=0,j=0; int n = sizeof(a)/4; //外循环n-1轮 for(i=0;i<n-1;i++){ int pos = i;//始终指向最小的位置 for(j=i+1;j<n;j++){ if(a[j]<a[pos]){ pos = j

找出最小的k个数

•已知数组中的n个正数,找出其中最小的k个数. •例如(4.5.1.6.2.7.3.8),k=4,则最小的4个数是1,2,3,4 •要求: –高效: –分析时空效率 •扩展:能否设计出适合在海量数据中实现上述运算? 方法一: 1 //利用最大根堆实现最小k个节点 2 //最大根堆特点:每个节点都比他左右孩子要大 3 //调整最大堆的时间复杂度为O(lnK),因此该算法(问题)时间复杂度为O(nlnK). 4 //思路:通过数组建堆 5 //规律:第i个节点的左孩子为2i+1,右孩子为2i+2 6

30 - 找出最小的k个数

题目描述:http://ac.jobdu.com/problem.php?pid=1371 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 第一种思路: 如上一题中,用快速排序中的划分函数,划分元素最终下标index小于K,划分[index+1, n]:划分元素最终下标index大于K,划分[0, index-1]; 找到划分元素下标是K时,停止,此时0 ~ K-1 为最小的K个数 时间复杂度O(n),缺点是会修改原数组

面试题-10亿个数中找出最大的10000个数(top K问题)

一个较好的方法:先拿出10000个建立小根堆,对于剩下的元素,如果大于堆顶元素的值,删除堆顶元素,再进行插入操作,否则直接跳过,这样知道所有元素遍历完,堆中的10000个就是最大的10000个.时间复杂度: m + (n-1)logm = O(nlogm) 优化的方法:可以把所有10亿个数据分组存放,比如分别放在1000个文件中(如果是字符串hash(x)%M).对每个文件,建立大小为10000的小根堆,然后按有序数组的合并合并起来,取出最大的10000个即是答案. top K问题 在大规模数据

9.7数学与概率(五)——功能:有些数的素数因子只有3、5、7,找出其中第k个数

/** * 功能:有些数的素数因子只有3.5.7,找出其中第k个数. */ 两种方法: 方法一: /** * 思路:将列表中的数字与3,5,7相乘,找出还未加入列表的最小数. * 每次要将Ai加入列表时,就用某个临时列表存放3Ai,5Ai和7Ai.要产生Ai+1时,搜索临时列表,找出最小值. * @param k * @return */ public static int getKthMagicNumger(int k){ if(k<0) return 0; int val=1; Queue

笔试题--在一个整数数组中找出第5大的数

/** * 在一个整数数组中找出第5大的数 * 思路是首先在数组中找到最小数,然后依次找到第五大的数 * * @param array * @return */ public static int[] selectionSort(int[] array) { if (array.length == 0) return array; for (int i = 0; i < array.length; i++) { int minIndex = i; for (int j = i; j < arr

在由N个元素构成的集合S中,找出最小元素C,满足C=A-B,其中A,B是都集合S中的元素,没找到则返回-1

package bianchengti; /* * 在由N个元素构成的集合S中,找出最小元素C,满足C=A-B, * 其中A,B是都集合S中的元素,没找到则返回-1 */ public class findMinValue { //快速排序 public static void sort(int a[], int low, int hight) { if (low > hight) { return; } int i, j, key; i = low; j = hight; key = a[i]

C语言:对传入sp的字符进行统计,三组两个相连字母“ea”&quot;ou&quot;&quot;iu&quot;出现的次数,并将统计结果存入ct所指的数组中。-在数组中找出最小值,并与第一个元素交换位置。

//对传入sp的字符进行统计,三组两个相连字母“ea”"ou""iu"出现的次数,并将统计结果存入ct所指的数组中. 1 #include <stdio.h> 2 #include <string.h> 3 #pragma warning (disable:4996) 4 void fun(char*sp ,int *ct) 5 { 6 int a=0, b=0, c=0; 7 while (*sp != '\0') 8 { 9 if (*s

刷题之给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数

今天下午,看了一会github,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的题.去发现问题. 题目:     给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 解析: 实际这里就是给你的一个列表的数字,给你一个预期,让你返