算法之求数组中最小的K个数

原创 2013年12月04日 13:47:28

算法思想:维护一个由K个元素组成的大顶堆,依次将数组中的元素与堆顶元素比较,

如果大于堆顶元素则舍弃,否则将元素放入堆顶并重新建堆。

如果对堆的相关知识不清楚可参考:排序算法之堆排序


java实现:

	public static int[] getMinElements(int[] a,int k){
		
		int[] heap=new int[k];
		
		//取数组的前k个元素
		for(int i=0;i<k;i++){
			
			heap[i]=a[i];
		}
		
		for(int i=k/2;i>=0;i--){
			
			heapAjust(heap,i);
		}
		
		//从数组的第k+1个元素开始遍历
		for(int i=k;i<a.length;i++){
			
			if(a[i]<heap[0]){
				
				heap[0]=a[i];
				heapAjust(heap, 0);
			}
		}
		
		return heap;
	}
	
	//重新将数组的第i+1个元素调整为堆
	private static void heapAjust(int[] a,int i){
		
		int index=0;
		
		for(int j=i;2*j+1<a.length-1;j=index)
		{
			index=2*j+1;
			
			if(index<a.length-1 && a[index+1]>a[index]){
				
				index++;
			}
			
			if(a[index]>a[j]){
				
				int temp=a[index];
				a[index]=a[j];
				a[j]=temp;
			}
			
		}
	}




相关文章推荐

bfprt算法----找出数组中最小的k个数(Java)

无序数组中最小的k个数 对于一个无序数组,数组中元素为互不相同的整数,请返回其中最小的k个数。 给定一个整数数组A及它的大小n,同时给定k,请返回其中最小的k个数。 测试样例: [1,2,4,3]...

求数组中最小的k个数以及海量数据最大堆、multiset解决方案

【题目】 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。 【方案一】 主要有两种方案。第一是利用我们熟知的...

寻找数组中最小的k个数(快排和堆排)

题目描述 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。 思路1:利用快排的思想,寻找第k个位置上正确的数,k位置...

【极难】【BFPRT算法】找到无序数组中最小的K个数

题目:来自脑客爱刷题 题目: 给定一个无序的整型数组arr,找到其中最小的k个数。 方法一:时间复杂度O(N*logK) O(N*logK)的解法说起来非常简单,就是一直维护一个k个数的大根堆,...

求一个数组中最小的K个数

面试的时候,面试官问了这道题“求一个数组中最小的k个数”,我当时只给出了两种解法: 1. 首先使用排序,然后选择前k个值返回。这种算法最好的时间复杂度是O(nlogn),取决于所选择的排序算法 2...

求数组中最小的k个数

思路1:当数组

剑指offer-求数组中最小的k个数

题目描述 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。解法1(冒泡排序)冒泡排序每循环一次能够选出一个最小的数,题目要求...

n 个数中最小的 k 个数

1. 描述 输入 n 个整数,输出其中最小的 k 个。 2. 解法 一般的方法是用选择排序,直到k个最小的数产生。时间复杂度为O(nk),空间复杂度为O(n)。 或者是对这n个数用...

查找n个数中最小的k个元素

/* 求n个数中最小的k个元素 * 用堆排序:时间复杂度为O(nlgk) */ #include /* 求左右叶子、父结点的宏定义 */ #define LEFT(i) ((i) * 2) ...

Top K问题

Top K问题在数据分析中非常普遍的一个问题(在面试中也经常被问到),比如: 从20亿个数字的文本中,找出最大的前100个。 解决Top K问题有两种思路, 最直观:小顶堆(大顶堆 -> 最小1...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法之求数组中最小的K个数
举报原因:
原因补充:

(最多只允许输入30个字)