一、二分查找(时间复杂度 O(log2n))
1、什么是二分查找
首先假设数据是升序的,然后记录下中间的数据,让要查找的数据与它比较,如果相等那么查找成功,如果不相等,那么把数据以这个中间的数据为界限分成前后两部分,如果要查找的数据比中间的这个数据小那么就去前半部分查找,如果要查找的数据比中间的这个数据大那么就去后半部分查找,重复以上过程,直到找到满足条件的数据,如果出现左边的数据比右边的大,那么查找失败。
2、优缺点
优点:查找速度快
缺点:待查找的数据必须是有序的
二、代码
1、递归实现
//l是数组的左下标,r是数组的右下标,注意数组的下标是从0开始的
int _binary_find(int* arr,size_t l,size_t r,int key)
{
if(l > r) return -1;//这个时候下标是非法的,返回-1
int pi = (l+r)/2;//标杆的下标
if(key > arr[pi])
return _binary_find(arr,pi+1,r,key);//更新左边的下标
else if(key < arr[pi])
return _binary_find(arr,l,pi-1,key);//更新右边的下标
else return pi;//找到了这个数据
}
//需要提供数组的首地址,长度以及要查找的值
int binary_find(int* arr,size_t len,int key)
{
return _binary_find(arr,0,len-1,key);
}
2、循环实现
int binary_find(int* arr,size_t len,int key)
{
int l = 0 , r = len -1 ;//l是左下标,r是右下标
while(l <= r) //在合法的条件内循环
{
int pi = (l+r) / 2;//标杆的下标
if(key > arr[pi])
l = pi + 1;//更新左边的下标
else if(key < arr[pi])
r = pi - 1;//更新右边的下标
else
return pi;//找到了返回
}
return -1;//出了循环就是下标违法了
}