二分查找(分治)

题目描述

请在一个有序递增数组中(不存在相同元素),采用二分查找,找出值 x 的位置,如果 x 在数组中不存在,请输出 -1 !

输入

第一行,一个整数 n ,代表数组元素个数(n≤10^6)

第二行,n 个数,代表数组的 n 个递增元素(1≤数组元素值≤10^8)

第三行,一个整数 x ,代表要查找的数(0≤x≤10^8)

输出

x 在数组中的位置,或者 -1

样例

输入

10
1 3 5 7 9 11 13 15 17 19
3

输出

2

非递归写法

#include 
using namespace std;
int n , x , a[1000010] , r = -1;
int main(){
	scanf("%d" , &n);
	for ( int i = 0 ; i < n ; i++ )
		scanf("%d" , &a[i]);
	scanf("%d" , &x);
	int l = 0 , ri = n-1 , mid;
	while ( l <= ri ){
		mid = (l+ri) / 2;
		if ( a[mid] == x ){
			r = mid+1;
			break;
		}else if ( x < a[mid] ) 
				ri = mid-1;
		else if ( x > a[mid] )
				l = mid+1;
		
	}
	printf("%d" , r);
	return 0;
}

递归写法

#include 
using namespace std;
int n , x , a[1000010] , ans = -1;
int f ( int l , int r ){
	if ( l <= r ){
		int mid = (l+r)/2;
		if ( a[mid] == x )
			return mid + 1;
		else if ( x < a[mid])
				return f(l , mid-1);
				else if ( x > a[mid] )
						return f(mid+1 , r);
	}else return -1;
} 
int main(){
	scanf("%d" , &n);
	for ( int i = 0 ; i < n ; i++ )
		scanf("%d" , &a[i]);
	scanf("%d" , &x);
	printf("%d" , f(0 , n-1));
	return 0;
}

递归插值查找写法

#include 
using namespace std;
int n , x , a[1000010] , ans = -1;
int f ( int l , int r ){
	if ( l <= r ){
		int mid = l + ( x - a[l] ) * (r - l) / (a[r] - a[l]);
		if ( a[mid] == x )
			return mid + 1;
		else if ( x < a[mid])
				return f(l , mid-1);
				else if ( x > a[mid] )
						return f(mid+1 , r);
	}else return -1;
} 
int main(){
	scanf("%d" , &n);
	for ( int i = 0 ; i < n ; i++ )
		scanf("%d" , &a[i]);
	scanf("%d" , &x);
	printf("%d" , f(0 , n-1));
	return 0;
}

 

 

你可能感兴趣的:(递归,分治,算法,数据结构)