寻找最小的k个数(Select方法)

原创 2012年09月15日 10:20:54
/*
 *寻找最小的k个数
 *题目描述:5.查找最小的k个元素
 *题目:输入n个整数,输出其中最小的k个。
 *例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。
 *
 *Randomized-Select方法,线性期望时间
 *时间复杂度O(n)
*/
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;
int random(int min,int max)
{
	time_t t; 
	srand((unsigned) time(&t)); 
	int i=int(rand()%(max-min+1))+min;
}
void exchange(vector<int>& vi,int i,int j)
{
	int tmp = vi[i];
	vi[i] = vi[j];
	vi[j] = tmp;
}
int partition(vector<int>& vi,int start,int end)
{
	int key = vi[end];
	int i = start -1;
	for(int j = start;j < end;++j)
	{
		if(vi[j] < key)
		{
			++i;
			exchange(vi,i,j);
		}
	}
	exchange(vi,i+1,end);
	return i+1;
}
int randomized_partition(vector<int>& vi,int start,int end)
{
	return partition(vi,start,end);
}
int randomized_select(vector<int>& vi,int start,int end,int i)
{
	if(start == end) return vi[start];
	else if(start < end)
		{
			int q = randomized_partition(vi,start,end);
			int k = q - start + 1;
			if(i == k)	return vi[q];
			else if(i < k)
			{
				return randomized_select(vi,start,q-1,i);
			}
			else
				return randomized_select(vi,q+1,end,i-k);
		}			 
}
int main(int argc,char **argv)
{
	vector<int> vi;
	vi.push_back(1);
	vi.push_back(5);
	vi.push_back(4);
	vi.push_back(6);
	vi.push_back(2);
	vi.push_back(3);
	vi.push_back(8);
	vi.push_back(7);
	int k = 3;
	//cout<<randomized_select(vi,0,vi.size()-1,6)<<endl;
	for(int i = 1;i <=vi.size();++i)
	{
		int res = randomized_select(vi,0,vi.size()-1,i);
		cout<<res<<endl;
	}
	return 0;
}
 

相关文章推荐

寻找最小的k个数(Randomized-Select方法)

/* *寻找最小的k个数 *题目描述:5.查找最小的k个元素 *题目:输入n个整数,输出其中最小的k个。 *例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。...

寻找最小的k个数(采用维护k个元素的最大堆的方法来实现)

/* *寻找最小的k个数 *题目描述:5.查找最小的k个元素 *题目:输入n个整数,输出其中最小的k个。 *例如输入1,2,3,4,5,6,7和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位置...

寻找 最小的k个数 线性选择算法 平均时间复杂度 O(n)

/* description: 寻找最小的k个数 有n个数,请找出最小的k个数要求时间复杂度尽可能低。方法1:全排序 时间复杂度O(n*logn) 方法2:部分排序 维护一个容量为k的堆 O(n*...

数据结构学习笔记5-寻找最小的k个数(选择排序和堆排序)

本文摘自《寻找最小的k个数》题目描述输入n个整数,输出其中最小的k个。

寻找最小的k个数 时间复杂度 O(n*k)

/* *寻找最小的k个数 *题目描述:5.查找最小的k个元素 *题目:输入n个整数,输出其中最小的k个。 *例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。...

寻找最小的k个数(先快速排序,然后输出前k个元素)

/* *寻找最小的k个数 *题目描述:5.查找最小的k个元素 *题目:输入n个整数,输出其中最小的k个。 *例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。...

Python BeautifulSoup4 select方法执行css选择器

初识爬虫,使用urllib结合强大的BeautifulSoup简单写了下代码。看参考书上主要讲解了find方法的使用,但发现其是还支持css选择器语法选择,于是试验了一下。环境为:ubuntu12.0...

Linux网络编程:TCP服务器(单进程多用户),使用select方法实现

Linux下的单进程多用户TCP服务器,采用select方法实现。 [cpp] view plaincopy /********************...

新浪微博 陈利人 面试题 给定k个数组,每个数组有k个整数。每个数组中选取一个整数,一共k个整数,取其和,一共可以得到k^k个和。给出方法,求得这k^k个和中,最小的k个。

本人设计的算法 时间复杂度O(K*K) 利用了堆,但是没有必要排序,所以时间复杂度较短,已用C++写出,请大家指正,谢谢 思路 : (1)对K个数组进行建小堆(建堆复杂度为O(n));...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:寻找最小的k个数(Select方法)
举报原因:
原因补充:

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