`

数组中第k大的数

阅读更多

方法:有两种。参见: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大的数

    给定一数组,查找数组中第k大的数。代码中借助快速排序中的partition方法来实现。

    计算整形数组中第k小的数

    在IT行业的算法领域,计算整形数组中第k小的数是一个经典的编程问题,它涉及到排序、查找等基础知识,是衡量一个程序员基本功的重要指标之一。本文将深入解析这一知识点,包括其背后的算法原理、实现方法以及优化...

    Python实现查找数组中任意第k大的数字算法示例

    在Python编程中,查找数组中第k大的数字是一项常见的任务,尤其在数据分析和算法竞赛中。这个任务通常涉及到数组操作,排序以及高效的查找技术。在给定的示例中,介绍了一个利用分治思想实现的算法,类似于快速排序...

    快速排序求解数组第k小元素

    快速排序的一个常见应用是查找数组中的第k小元素。这种需求在很多算法竞赛(如ACM)和实际问题解决中都非常有用。 #### 快速排序基础 快速排序的基本思想是选择一个基准值(pivot),然后将数组分为两部分:一部分...

    数组循环移动k位- C++

    数组循环移动,通常指的是将数组中的元素向左或向右移动固定步数(k位),同时保持数组中元素的相对顺序不变。例如,对于数组`[1, 2, 3, 4, 5]`,若向右移动2位,则结果为`[4, 5, 1, 2, 3]`;若向左移动2位,则结果...

    17082 两个有序数序列中找第k小

    17082 两个有序数序列中找第k小(必做) 时间限制:1000MS 内存限制:65535K 提交次数:0 通过次数:0 题型: 编程题 语言: C++;C;VC;JAVA Description 已知两个已经排好序(非减序)的序列X和Y,其中X的长度为m,Y长度为...

    典型的Top K算法 找出一个数组里面前K个最大数.doc

    Top K算法是解决一个经典的问题,即在一个大规模的数组中找到前K个最大数的问题。在这个问题中,我们需要在一个数组中找到前K个最大数,例如在搜索引擎中,需要找出最热门的10个查询串。下面我们将详细地介绍Top K...

    java-leetcode题解之第215题数组中的第K个最大元素.zip

    给定一个非空整数数组,找到数组中第K个最大的元素。这里的“最大”指的是数值上的最大,而不是字典序的最大。注意,K始终是有效的,即1 ≤ K ≤ 数组的长度。 知识点1:数组操作 在Java中,数组是一种基本的数据...

    C#递归算法寻找数组中第K大的数

    在本场景中,我们讨论的是如何使用递归算法在数组中寻找第K大的数。这个任务常见于数据结构和算法的学习,以及在实际编程中处理数据排序和查找问题时。 1. **递归算法原理**: 递归算法的基本思想是将大问题分解为...

    c语言面试题之双指针数组中的K-diff数对.zip

    本面试题探讨的是在数组中寻找K-diff数对,即数组中两个元素之间的差值为K的数对。这里我们将深入解析这个问题,探讨其解决方案,并分析双指针在其中的作用。 首先,我们要理解问题的背景。假设我们有一个整数数组`...

    C++算法之在无序数组中选择第k小个数的实现方法

    本文实例讲述了C++算法之在无序数组中选择第k小个数的实现方法。分享给大家供大家参考,具体如下: 从一个无序的整型数组中选出第k小的数,如k=1为最小数,k=n为最大数。这里数组可以是有重复的值! 下面是自己写的...

    求数组的逆序数

    在计算机科学和编程领域,"数组的逆序数"是一个重要的概念,特别是在算法分析和排序算法中。逆序数(Inversion Count)是指在数组或序列中,如果一个大于其后面的元素,则这样的对称为逆序对。逆序数就是数组中逆序...

    js代码-数组中的第K个最大元素

    快速选择是快速排序的一个变种,用于寻找数组中第K小或第K大的元素,平均时间复杂度为O(n)。它通过分治策略来选择枢轴,使得一部分元素小于枢轴,一部分大于枢轴,直到找到目标位置。 4. **计数排序法**: 如果...

    python-leetcode面试题解之第215题数组中的第K个最大元素-题解.zip

    这里的“最大”是指数值上的大,而“第K个”则意味着我们需要找到排序后的数组中位于K索引处的元素。例如,如果数组为[3,2,1,5,6,4],且K=2,那么答案是5,因为5是数组排序后第二个最大的元素。 在Python中,有几种...

    数组中求第K大数的实现方法

    在编程和算法设计中,"数组中求第K大数"是一个常见的问题,它涉及到高效地从一组数据中找出第K个最大值。本问题的解决方案通常基于分治策略,如快速选择算法,这是一种简化版的快速排序算法,用于解决特定情况下的...

    c语言入门编程之数组操作子数组最大平均数.zip

    这段代码首先初始化最大平均数为整数最小值,然后遍历数组,用两个嵌套循环计算每个k大小的子数组的平均值,如果当前子数组的平均值大于已知的最大平均数,就更新最大平均数。 5. **注意事项** - C语言的数组索引...

    求有N个元素的数组中前k个最大的数?(N>=k)(python实现)

    具体思路为:第一次先遍历数组找到最大的数,第二次遍历从剩下的数组中找到最大的数(在整个数组中第二大的数)…共需遍历k次,这种方法的时间复杂度为O(N*k) 方法三:综合法 该方法思路是: (1)维护一个大小为k的...

    两个有序数序列中找第k小(必做)

    已知两个已经排好序(非减序)的序列X和Y,其中X的长度为m,Y长度为n, 现在请你用分治算法,找出X和Y的第k小的数,算法时间复杂度为O(max{logm, logn})。

    几种查找数组的前K个最小值的算法.docx

    该方法首先给定一个K个大小的数组b,然后复制数组a中的前K个数到数组b中,将这K个数当成数组a的前K个最小值,对数组b创建最大堆,然后遍历数组a,比较数组a中的其他元素,如果其他元素小于数组b的最大值(堆顶),则...

Global site tag (gtag.js) - Google Analytics