应用条件:有序数组
核心思想:不断求中间值与所查找的值进行比较,不断缩小查找范围。
算法时间复杂度:o(logn)
图示:
查找18
第一步:
1 | 3 | 6 | 8 | 13 | 16 | 18 | 21 | 29 | 36 |
0 1 2 3 4 5 6 7 8 9
right=length-1=9,left=0;mid=(right+left)/2=4
nums[mid]=13<18;所有在mid的右边区间,left=mid+1=5
第二步:
1 | 3 | 6 | 8 | 13 | 16 | 18 | 21 | 29 | 36 |
0 1 2 3 4 5 6 7 8 9
更新mid,mid=(left+right)/2=7,nums[mid]=21>18,在中间值的左区间
right=mid-1=6
第三步:
1 | 3 | 6 | 8 | 13 | 16 | 18 | 21 | 29 | 36 |
0 1 2 3 4 5 6 7 8 9
mid=5,nums[mid]=16<18;在中间值的右区间
left=mid+1=6=right
第四步:
1 | 3 | 6 | 8 | 13 | 16 | 18 | 21 | 29 | 36 |
0 1 2 3 4 5 6 7 8 9
这时mid=right=left,nums[mid]==18,返回mid的值就是查找数的下标。
代码实现:
int BinarySearch(int *nums,int targe,int numsSize)
{
int right=numsSize-1,left=0;//初始边界条件
int mid;//中间值
while(left<=right)
{
mid=(right+left)/2;
if(targe<nums[mid])
{
right=mid-1;//查找值在中间值的左区间
}
else if(targe>nums[mid])
{
left=mid+1;//查找值在中间值的右区间
}
else//查找值等于中间值所对应的数
return mid;
}
if(left>right)//遍历结束,没有找到查找值
{
printf("查找失败,查找值不存在\n");
return -1;
}
}