二分查找

二分查找:

在有序表中查找元素常常使用二分查找,也叫“折半查找”,他的基本思路就像是“猜数字游戏”:在你心里想一个不超过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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值