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