二分查找:

在有序表中查找元素常常使用二分查找,也叫“折半查找”,他的基本思路就像是“猜数字游戏”:在你心里想一个不超过1000的正整数,可以保证在10次之内猜到它,只要每次告诉我猜的数是比你想的大一些还是小一些,还是正好猜中。猜的方法就是“二分”。

二分查找复杂度

时间复杂度是O(logn)。

空间复杂度:
二分查找递归时辅助空间为常数,递归深度了log(n),所以空间复杂度log(n)

 

核心代码:

int Binarysearch(int a[],int key,int left,int right)
{
	int mid;
	while(left+1<right)
	{
		mid=(left+right)/2;
		if(a[mid]==key)
			return mid;
		else if(a[mid]<key)
			left=mid;
		else
			right=mid;
	}
	if(a[left]==key)
		return left;
	if(a[right]==key)
		return right;
	return -1;
}

 

变形:

 

1.如果序列存在重复的Key值,返回Key值的最小下标,不存在则返回-1。

    在二分查找中如果找到和key值相等的就return结束,但是在这个问题中不能停止,还需要继续查找。

    如果是a[mid]<=key里的时候是找最大的下标。如果是a[mid]>=key里的时候是找最小的下标。

代码:

int Binarysearch(int a[],int key,int left,int right)
{
	int mid;
	while(left+1<right)
	{
		mid=(left+right)/2;
		if(a[mid]<key)
			left=mid;
		else
			right=mid;
	}
	if(a[left]==key)
		return left;
	if(a[right]==key)
		return right;
	return -1;
}

 

2.如果序列存在重复的Key值,返回Key值的最大下标,不存在返回-1。

代码:

int Binarysearch(int a[],int key,int left,int right)
{
	int mid;
	while(left+1<right)
	{
		mid=(left+right)/2;
		if(a[mid]<=key)
			left=mid;
		else
			right=mid;
	}
	if(a[left]==key)
		return left;
	if(a[right]==key)
		return right;
	return -1;
}

 

3.返回大于Key值的最小下标。

代码:

int Binarysearch(int a[],int key,int left,int right)
{
	int mid;
	while(left+1<right)
	{
		mid=(left+right)/2;
		if(a[mid]<=key)
			left=mid;
		else
			right=mid;
	}
	if(a[left]>key)
		return left;
	if(a[right>key)
		return right;
	return -1;
}