方法:有两种。参见:http://hi.baidu.com/mianshiti/blog/item/3dc76cee353279dfb31cb1a0.html
第一种:使用排序(快速排序),将数组排序后,第k大的数就在第k个位置上。算法复杂度:o(n*logn)
第二种:类似快速排序的变种。通过二分的思想,找到第k大的数字,而不必对整个数组排序。
从数组中随机选一个数t,通过让这个数和其它数比较,我们可以将整个数组分成了两部分并且满足,{x, xx, ..., t} < {y, yy, ...}。
在将数组分成两个数组的过程中,我们还可以记录每个子数组的大小。这样我们就可以确定第k大的数字在哪个子数组中。
然后我们继续对包含第k大数字的子数组进行同样的划分,直到找到第k大的数字为止。
平均来说,由于每次划分都会使子数组缩小到原来1/2,所以整个过程的复杂度为O(N)。
public class FindKthMax {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] array=new int[]{2,4,3,4,7};
int k=3;
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]);
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]);
return ;
}
if(k<j)
find(array,left,j-1,k);
else
find(array,j+1,right,k);
}
}
运行结果:the 3th max number is:4
分享到:
相关推荐
给定一数组,查找数组中第k大的数。代码中借助快速排序中的partition方法来实现。
在IT行业的算法领域,计算整形数组中第k小的数是一个经典的编程问题,它涉及到排序、查找等基础知识,是衡量一个程序员基本功的重要指标之一。本文将深入解析这一知识点,包括其背后的算法原理、实现方法以及优化...
在Python编程中,查找数组中第k大的数字是一项常见的任务,尤其在数据分析和算法竞赛中。这个任务通常涉及到数组操作,排序以及高效的查找技术。在给定的示例中,介绍了一个利用分治思想实现的算法,类似于快速排序...
快速排序的一个常见应用是查找数组中的第k小元素。这种需求在很多算法竞赛(如ACM)和实际问题解决中都非常有用。 #### 快速排序基础 快速排序的基本思想是选择一个基准值(pivot),然后将数组分为两部分:一部分...
数组循环移动,通常指的是将数组中的元素向左或向右移动固定步数(k位),同时保持数组中元素的相对顺序不变。例如,对于数组`[1, 2, 3, 4, 5]`,若向右移动2位,则结果为`[4, 5, 1, 2, 3]`;若向左移动2位,则结果...
17082 两个有序数序列中找第k小(必做) 时间限制:1000MS 内存限制:65535K 提交次数:0 通过次数:0 题型: 编程题 语言: C++;C;VC;JAVA Description 已知两个已经排好序(非减序)的序列X和Y,其中X的长度为m,Y长度为...
Top K算法是解决一个经典的问题,即在一个大规模的数组中找到前K个最大数的问题。在这个问题中,我们需要在一个数组中找到前K个最大数,例如在搜索引擎中,需要找出最热门的10个查询串。下面我们将详细地介绍Top K...
给定一个非空整数数组,找到数组中第K个最大的元素。这里的“最大”指的是数值上的最大,而不是字典序的最大。注意,K始终是有效的,即1 ≤ K ≤ 数组的长度。 知识点1:数组操作 在Java中,数组是一种基本的数据...
在本场景中,我们讨论的是如何使用递归算法在数组中寻找第K大的数。这个任务常见于数据结构和算法的学习,以及在实际编程中处理数据排序和查找问题时。 1. **递归算法原理**: 递归算法的基本思想是将大问题分解为...
本面试题探讨的是在数组中寻找K-diff数对,即数组中两个元素之间的差值为K的数对。这里我们将深入解析这个问题,探讨其解决方案,并分析双指针在其中的作用。 首先,我们要理解问题的背景。假设我们有一个整数数组`...
本文实例讲述了C++算法之在无序数组中选择第k小个数的实现方法。分享给大家供大家参考,具体如下: 从一个无序的整型数组中选出第k小的数,如k=1为最小数,k=n为最大数。这里数组可以是有重复的值! 下面是自己写的...
在计算机科学和编程领域,"数组的逆序数"是一个重要的概念,特别是在算法分析和排序算法中。逆序数(Inversion Count)是指在数组或序列中,如果一个大于其后面的元素,则这样的对称为逆序对。逆序数就是数组中逆序...
快速选择是快速排序的一个变种,用于寻找数组中第K小或第K大的元素,平均时间复杂度为O(n)。它通过分治策略来选择枢轴,使得一部分元素小于枢轴,一部分大于枢轴,直到找到目标位置。 4. **计数排序法**: 如果...
这里的“最大”是指数值上的大,而“第K个”则意味着我们需要找到排序后的数组中位于K索引处的元素。例如,如果数组为[3,2,1,5,6,4],且K=2,那么答案是5,因为5是数组排序后第二个最大的元素。 在Python中,有几种...
在编程和算法设计中,"数组中求第K大数"是一个常见的问题,它涉及到高效地从一组数据中找出第K个最大值。本问题的解决方案通常基于分治策略,如快速选择算法,这是一种简化版的快速排序算法,用于解决特定情况下的...
这段代码首先初始化最大平均数为整数最小值,然后遍历数组,用两个嵌套循环计算每个k大小的子数组的平均值,如果当前子数组的平均值大于已知的最大平均数,就更新最大平均数。 5. **注意事项** - C语言的数组索引...
具体思路为:第一次先遍历数组找到最大的数,第二次遍历从剩下的数组中找到最大的数(在整个数组中第二大的数)…共需遍历k次,这种方法的时间复杂度为O(N*k) 方法三:综合法 该方法思路是: (1)维护一个大小为k的...
已知两个已经排好序(非减序)的序列X和Y,其中X的长度为m,Y长度为n, 现在请你用分治算法,找出X和Y的第k小的数,算法时间复杂度为O(max{logm, logn})。
该方法首先给定一个K个大小的数组b,然后复制数组a中的前K个数到数组b中,将这K个数当成数组a的前K个最小值,对数组b创建最大堆,然后遍历数组a,比较数组a中的其他元素,如果其他元素小于数组b的最大值(堆顶),则...