查找最小的k个元素

原创 2013年12月03日 14:36:03

题目:输入n个整数,输出其中最小的k个。例如:输入1,2,3,4,5,6,7,8,则最小的4个数是1,2,3,4。

分析:采取一般的排序算法,如快速排序,堆排序,归并排序,等,先将这n个整数进行排序,然后再取最小的k个。那么时间复杂度为nlgn。

           我们可以从数组中取k个元素,建一个k个元素的最大堆,继续从数组里面取出元素,如果该元素大于堆中最大元素,那么舍弃,继续;如果小于,则将该元素替换掉堆中最大元素,并调整最大堆结构,维护最大堆性质不变,维护最大堆的性质,时间复杂度为lgk,那么总的时间复杂度为nlgk。这样最终堆中的k个元素即为最小的k个数。

           而STL中,set和multiset很好地实现了堆的性质,但是set中不允许存在相同的元素,而multiset则允许,那么我们采用multiset来实现最大堆。

#include "stdafx.h"
#include <vector>
#include <set>
#include <iostream>

using namespace std;

typedef multiset<int,greater<int>> IntSet;
void FindLeastKNumbers_(int a[], IntSet &leastNumbers, int nLength,int k)
{
	//a.clear();
	//如果原数组元素个数小于k,则不合题意,返回
	if(nLength < k)
		return;
	for(int i=0;i<nLength;i++)
	{
		if(leastNumbers.size()<k)
			leastNumbers.insert(a[i]);	//取前面k个元素建最大堆
		else
		{
			IntSet::iterator iterFirst = leastNumbers.begin();
			if(*iterFirst>(a[i]))
			{
				leastNumbers.erase(iterFirst);
				leastNumbers.insert(a[i]);
			}
		}
	}
}
int _tmain(int argc, _TCHAR* argv[])
{
	int a[20] = {1,2,7,9,3,6,2,9,8,10,11,17,12,18,19,16,17,14,5,20};
	IntSet heapset;
	FindLeastKNumbers_(a,heapset,20,6);
	IntSet::iterator iter = heapset.begin();
	for(;iter!=heapset.end();iter++)
		cout<<*iter<<",";
	return 0;
}

查找最小的k个元素(笔试题) 输入n个整数,输出其中最小的k个。 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4

查找最小的k个元素(笔试题) 输入n个整数,输出其中最小的k个。 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4 #include int main(...
  • qq_38365745
  • qq_38365745
  • 2017年05月10日 23:26
  • 310

算法之查找第k小的数和查找最小的k个元素

利用快速排序的思想查找第k小的数,其中用到了随机数,但是主要的核心思想还是快速排序,具体的细节可以查看《算法导论》第九章,下面只是照书上实现的代码:             /* 查找数据组中,第k小...
  • qingtianweichong
  • qingtianweichong
  • 2013年05月22日 14:01
  • 2233

找出n个元素中最小的k个数(编程珠玑第二章)

思想:用最大堆操作来减少时间
  • u010585135
  • u010585135
  • 2014年10月06日 22:39
  • 909

纯C语言:分治查找第K个最小元素源码

#include void fun(int array[],int low,int high) { int i = low; int j = high; int temp ...
  • u011131296
  • u011131296
  • 2014年01月03日 00:05
  • 1623

第5题:查找最小的K个元素

欢迎转载,转载请务必注明出处:http://blog.csdn.net/alading2009/article/details/44752297第5题:输入n个整数,输出其中最小的K个。(数组) 例...
  • alading2009
  • alading2009
  • 2015年03月30日 16:01
  • 489

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

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

查找最小的k个元素 C++实现

题目:输入n个整数,输出其中最小的k个。 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。 分析:这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前面的...
  • lizhe10177
  • lizhe10177
  • 2014年02月24日 11:59
  • 606

查找第K小元素(C语言版)

关于查找数列中第k小的元素的常见方法: 1、先排序整个数列然后取第k-1个数 2、利用选择排序 3、选择算法 4、利用计数排序的思想 5、利用堆排序思想(一) 6、利用堆排序思想(二)...
  • Thinkpad4180NC5
  • Thinkpad4180NC5
  • 2014年10月22日 14:16
  • 2965

[Baidu面试题]题目1:输入n个整数,输出其中最小的k个。

题目:输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7,8,9这9个数字,则最小的3个数字为1,2,3。    分析:这道题最简单最直接的思路莫过于把输入的n个整数进行排序,这样排...
  • zzs85aa
  • zzs85aa
  • 2011年04月27日 22:03
  • 3821

从n个元素中找出第K小的数 利用快排的思想来实现

从n个无序的顺序表中找出第k小的数,采用快排思想: 先从n个元素中随便寻找一个数m作为分界点,m在列表中的位置为i 当 i = k时,m就是我们要寻找的第k小的数; 当 i > k时,我们就从1~i-...
  • a15994269853
  • a15994269853
  • 2014年03月19日 21:14
  • 3510
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:查找最小的k个元素
举报原因:
原因补充:

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