问题:《编程之美》page139.寻找最大的k个数。
方法一:通过全排序(快速排序),然后获取前k个数即位最大的k个数。算法复杂度:O(nlogn).
方法二:通过部分排序。(选择排序,冒泡排序),直接获取前k个最大的数。算法复杂度O(n*k).当k比较小的时候可以考虑
方法三:快速排序的变种。前面寻找数组中第k大数的过程中,当找准数组中第k大数的位置时,数组中比k大的数据都在k的left边,比k小的数据都在k的right边。从而获取前k大的数据。其实也是部分排序。算法复杂度:O(n).
public class FindKth {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] array=new int[]{2,4,3,4,7};
int k=4;
find(array,0,array.length-1,k-1);
}
public static void find(int[] array,int left, int right,int k){
if(k==left && k==right) {
System.out.println("the "+(k+1)+"th max number is:" + array[k]);
print(array,k);
return ;
}
int i=left;
int j=right+1;
int key=array[left];
while(true){
do{
i++;
}while(i<=right&&array[i]>key);
do{
j--;
}while(j>=left&&array[j]<key);
if(j<i) break;
int tmp=array[i];
array[i]=array[j];
array[j]=tmp;
}
int tmp=array[left];
array[left]=array[j];
array[j]=tmp;
if(j==k) {
System.out.println("the "+(k+1)+"th max number is:" + array[j]);
print(array,k);
return ;
}
if(k<j)
find(array,left,j-1,k);
else
find(array,j+1,right,k);
}
public static void print(int[] array,int k){
System.out.println("find numbers are: ");
for(int i=0;i<=k;i++){
System.out.print(array[i]+ " ");
}
}
}
运行结果:
the 4th max number is:3
find numbers are:
7 4 4 3
方法四:如果N很大,比如100亿。可以采用一个数组,数组中始终保持访问过的所有的数中的前k个最大的数据,每次从k个数中淘汰掉最小的数,到最后可以一次遍历获取前k个最大的数据。通过维持一个容量为k的最小堆的方式来实现。算法复杂度O(n*log2k)
分享到:
相关推荐
给定一数组,查找数组中第k大的数。代码中借助快速排序中的partition方法来实现。
Top K算法是解决一个经典的问题,即在一个大规模的数组中找到前K个最大数的问题。在这个问题中,我们需要在一个数组中找到前K个最大数,例如在搜索引擎中,需要找出最热门的10个查询串。下面我们将详细地介绍Top K...
在IT行业的算法领域,计算整形数组中第k小的数是一个经典的编程问题,它涉及到排序、查找等基础知识,是衡量一个程序员基本功的重要指标之一。本文将深入解析这一知识点,包括其背后的算法原理、实现方法以及优化...
例如,对于数组[3, 5, 6, 7, 2, -1, 9, 3],第5大的数字是6,因为它在去除数组中的前4个最大元素(9, 7, 6, 5)后剩余的最大值。 在给定的代码中,定义了一个名为`partitionOfK`的函数,它接受以下参数: 1. `...
该方法首先给定一个K个大小的数组b,然后复制数组a中的前K个数到数组b中,将这K个数当成数组a的前K个最小值,对数组b创建最大堆,然后遍历数组a,比较数组a中的其他元素,如果其他元素小于数组b的最大值(堆顶),则...
数组循环移动,通常指的是将数组中的元素向左或向右移动固定步数(k位),同时保持数组中元素的相对顺序不变。例如,对于数组`[1, 2, 3, 4, 5]`,若向右移动2位,则结果为`[4, 5, 1, 2, 3]`;若向左移动2位,则结果...
求有N个元素的数组中前k个最大的数?(N>=k) 方法一:排序法 可以先将数组排序,然后再截取前k个最大的数,利用归并排序或者快速排序等排序方式,该方法平均时间复杂度为O(N*logN) 方法二:部分排序法 由于只需要找出...
本面试题探讨的是在数组中寻找K-diff数对,即数组中两个元素之间的差值为K的数对。这里我们将深入解析这个问题,探讨其解决方案,并分析双指针在其中的作用。 首先,我们要理解问题的背景。假设我们有一个整数数组`...
在计算机科学和编程领域,"数组的逆序数"是一个重要的概念,特别是在算法分析和排序算法中。逆序数(Inversion Count)是指在数组或序列中,如果一个大于其后面的元素,则这样的对称为逆序对。逆序数就是数组中逆序...
标题提及的“几种查找数组的前K个最小值的算法”是计算机科学中常见的问题,主要涉及算法和数据结构的应用。以下是对这些方法的详细解释: 1. **排序法**: - 最简单的方法是先对整个数组进行排序,然后直接选取前...
快速排序的一个常见应用是查找数组中的第k小元素。这种需求在很多算法竞赛(如ACM)和实际问题解决中都非常有用。 #### 快速排序基础 快速排序的基本思想是选择一个基准值(pivot),然后将数组分为两部分:一部分...
这段代码首先初始化最大平均数为整数最小值,然后遍历数组,用两个嵌套循环计算每个k大小的子数组的平均值,如果当前子数组的平均值大于已知的最大平均数,就更新最大平均数。 5. **注意事项** - C语言的数组索引...
给定一个非空整数数组,找到数组中第K个最大的元素。这里的“最大”指的是数值上的最大,而不是字典序的最大。注意,K始终是有效的,即1 ≤ K ≤ 数组的长度。 知识点1:数组操作 在Java中,数组是一种基本的数据...
在本场景中,我们讨论的是如何使用递归算法在数组中寻找第K大的数。这个任务常见于数据结构和算法的学习,以及在实际编程中处理数据排序和查找问题时。 1. **递归算法原理**: 递归算法的基本思想是将大问题分解为...
17082 两个有序数序列中找第k小(必做) 时间限制:1000MS 内存限制:65535K 提交次数:0 通过次数:0 题型: 编程题 语言: C++;C;VC;JAVA Description 已知两个已经排好序(非减序)的序列X和Y,其中X的长度为m,Y长度为...
本问题涉及的是一个特定的数组操作,即“换位”操作,它要求将数组的前k个元素与剩余的n-k个元素进行交换,而这个过程需要在最坏情况下达到线性时间复杂度O(n)。这里我们主要关注如何用Java来实现这个算法。 首先,...
本文实例讲述了C++算法之在无序数组中选择第k小个数的实现方法。分享给大家供大家参考,具体如下: 从一个无序的整型数组中选出第k小的数,如k=1为最小数,k=n为最大数。这里数组可以是有重复的值! 下面是自己写的...
通过以上方法,我们可以高效地在无序数组中找到中位数,而无需对整个数组进行排序,这在处理大数据集时尤其有用。同时,了解如何在Python Streaming中实现字段排序,有助于在分布式计算环境中进行数据处理。
- 遍历法:在已排序数组中,找到最大值后,再遍历一次数组找到次大值。 - 优先队列(堆):使用最大堆结构,可以快速找到最大的k个元素。 三、排序算法的时间复杂度和稳定性 时间复杂度是衡量排序算法效率的重要...