微软面试100题目之5 查找最小的k个元素

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

 

首先随即选择一个数组的的元素,比这个元素大的(小的)放到他的后面,比这个元素大的放到他的后面(前面),时间复杂度要求为O(n)

int TiaoZheng(int a[],int len)
{
	srand(time(NULL));
	int idx=rand()%(len+1);
	Swap(a[idx],a[len]);
	int i=-1;
	for(int j=0;j<=len;j++)
	{
		if(a[j]<a[len])
		{
			Swap(a[++i],a[j]);
		}
	}
	Swap(a[++i],a[len]);
	return i;
}


 

int TiaoZheng(int a[],int len)
{
	srand(time(NULL));
	int idx=rand()%(len+1);
	Swap(a[idx],a[len]);
	int i=-1;
	for(int j=0;j<=len;j++)
	{
		if(a[j]>a[len])
		{
			Swap(a[++i],a[j]);
		}
	}
	Swap(a[++i],a[len]);
	return i;
}

如上述算法成功之后。就解决了很多问题。

如下代码:

void Swap(int& i,int& j)
{
	int temp=i;
	i=j;
	j=temp;
}
int TiaoZheng(int a[],int len)
{
	srand(time(NULL));
	int idx=rand()%(len+1);
	Swap(a[idx],a[len]);
	int i=-1;
	for(int j=0;j<=len;j++)
	{
		if(a[j]>a[len])
		{
			Swap(a[++i],a[j]);
		}
	}
	Swap(a[++i],a[len]);
	return i;
}
int getMaxK(int *p,int n,int k)
{
	int mid;
	if(k<=0)
		return -1;
	if(n<k)
		return -1;
	mid=TiaoZheng(p,n-1);
	if(mid==n-k)
		return p[mid];
	else if(mid>n-k)
	{
		getMaxK(p,mid,mid-(n-k));
	}
	else if(mid<n-k)
		getMaxK(p+mid+1,n-mid-1,k);
}
int main(void)
{	
	//BiTree p=NULL;
	//createBiTree(p);
	//std::vector<int> path;
	//cout<<"18的路径:"<<endl;
	//FindPath(p,18,path,0);
	int a[]={3,4,5,6,1,0,-1,19};
	for(int i=1;i<=4;i++)
		cout<<getMaxK(a,sizeof(a)/sizeof(int),i)<<" ";
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值