二分法与快排结合(2)

#1133 : 二分·二分查找之k小数

时间限制: 10000ms
单点时限: 1000ms
内存限制: 256MB
描述

在上一回里我们知道Nettle在玩《艦これ》,Nettle的镇守府有很多船位,但船位再多也是有限的。Nettle通过捞船又出了一艘稀有的船,但是已有的N(1≤N≤1,000,000)个船位都已经有船了。所以Nettle不得不把其中一艘船拆掉来让位给新的船。Nettle思考了很久,决定随机选择一个k,然后拆掉稀有度第k小的船。 已知每一艘船都有自己的稀有度,Nettle现在把所有船的稀有度值告诉你,希望你能帮他找出目标船。

提示:非有序数组的二分查找之二

输入

第1行:2个整数N,k。N表示数组长度,
第2行:N个整数,表示a[1..N],保证不会出现重复的数,1≤a[i]≤2,000,000,000。

输出

第1行:一个整数t,表示t在数组中是第k小的数,若K不在数组中,输出-1。

样例输入
10 4
1732 4176 2602 6176 1303 6207 3125 1 1011 6600
样例输出
1732
#include<iostream>
/*采用两头交换法*/ 
using namespace std;
	int a[1111111];
	int n,k;
void Search(int l,int r)
{
	int m,t,g;
	m=l;
	t=r;
	g=a[(m+t)/2];
	do
	{
		while(a[m]<g) m++;
		while(a[t]>g) t--;
		if(m<=t)
		{
			int  y;
			y=a[m];
			a[m]=a[t];
			a[t]=y;
			m++;
			t--;
		}
		
	}while(m<=t);
	if(t==m-2)//这个条件关键(它是唯一能确定当前所指向的数顺序排第几) 
	{
		if(t+1==k)
		{
			cout<<a[t+1]<<endl;
		/*return(a[t+1]);*/
		}
	}
	if(k<=t)//(等于号不可省对于边界值很重要)。 
	Search(l,t);
	if(k>=m)
	Search(m,r);	
}
int main()
{
	cin>>n>>k;
	int i;
	for(i=1;i<=n;i++)
		cin>>a[i];
	if(k<=0||k>n)
		cout<<-1<<endl;
	else
	Search(1,n);
	/*cout<<p<<endl;*/


	return 0;	
 } 
本次题目我看了网上是快排标准法比较多,我就尝试了一下两头交换法与二分的结合,写的不好的地方希望网者指正。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值