`

数组中前k大的数

阅读更多

问题:《编程之美》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大的数

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

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

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

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

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

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

    例如,对于数组[3, 5, 6, 7, 2, -1, 9, 3],第5大的数字是6,因为它在去除数组中的前4个最大元素(9, 7, 6, 5)后剩余的最大值。 在给定的代码中,定义了一个名为`partitionOfK`的函数,它接受以下参数: 1. `...

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

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

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

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

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

    求有N个元素的数组中前k个最大的数?(N&gt;=k) 方法一:排序法 可以先将数组排序,然后再截取前k个最大的数,利用归并排序或者快速排序等排序方式,该方法平均时间复杂度为O(N*logN) 方法二:部分排序法 由于只需要找出...

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

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

    求数组的逆序数

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

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

    标题提及的“几种查找数组的前K个最小值的算法”是计算机科学中常见的问题,主要涉及算法和数据结构的应用。以下是对这些方法的详细解释: 1. **排序法**: - 最简单的方法是先对整个数组进行排序,然后直接选取前...

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

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

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

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

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

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

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

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

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

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

    Java实现将数组的子数组a[0:k]和a[k+1:n-1]进行换位的算法

    本问题涉及的是一个特定的数组操作,即“换位”操作,它要求将数组的前k个元素与剩余的n-k个元素进行交换,而这个过程需要在最坏情况下达到线性时间复杂度O(n)。这里我们主要关注如何用Java来实现这个算法。 首先,...

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

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

    python 实现在无序数组中找到中位数方法

    通过以上方法,我们可以高效地在无序数组中找到中位数,而无需对整个数组进行排序,这在处理大数据集时尤其有用。同时,了解如何在Python Streaming中实现字段排序,有助于在分布式计算环境中进行数据处理。

    算法-数组排序 按数组内数字大小排序 取得最大值或最小值.rar

    - 遍历法:在已排序数组中,找到最大值后,再遍历一次数组找到次大值。 - 优先队列(堆):使用最大堆结构,可以快速找到最大的k个元素。 三、排序算法的时间复杂度和稳定性 时间复杂度是衡量排序算法效率的重要...

Global site tag (gtag.js) - Google Analytics