算法作业:第二章上机实验报告

算法作业:第二章上机实验报告

题目:

设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。

输入格式:

第一行是n值和x值; 第二行是n个不相同的整数组成的非降序序列,每个整数之间以空格分隔。

输出格式:

输出小于x的最大元素的最大下标i和大于x的最小元素的最小下标j。当搜索元素在数组中时,i和j相同。 提示:若x小于全部数值,则输出:-1 0 若x大于全部数值,则输出:n-1的值 n的值

题解分析:

可直接利用二分搜索寻找目标数。只需要在搜索结束后判断目标情况即可。

复杂度分析:

本题使用了O(\(log_{2}n\))二分搜索算法再加上了最后的O(1)判断,所以总复杂度还是O(\(log_{2}n\))。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int a[maxn];
int main()
{
	#ifdef TEST
		freopen("input.txt","r",stdin);
    #endif
	int T,n,m,i,j,k;
	scanf("%d",&n);
	scanf("%d",&k);
	for(i=0;i<n;i++)scanf("%d",&a[i]);
	int l=0,r=n-1,mid,cnt=0;
	while(l<r)
	{
		mid=(l+r)>>1;
//		cout<<"-----"<<mid<<" "<<a[mid]<<endl;
		if(a[mid]>=k) r=mid;
		else l=mid+1; 
	}
	if(a[l]==k) cout<<l<<" "<<l<<endl;
	else if(l==0) cout<<"-1 0"<<endl;
	else if(l==n-1) cout<<n-1<<" "<<n<<endl;
	else cout<<l-1<<" "<<l<<endl;
}


posted on 2018-10-21 10:31  TRZNDP_Z  阅读(178)  评论(0编辑  收藏  举报

导航