二分查找法

应用条件:有序数组

核心思想:不断求中间值与所查找的值进行比较,不断缩小查找范围。

算法时间复杂度:o(logn)

图示:

查找18

第一步:

1368131618212936

    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

第二步:

1368131618212936

     0                  1               2                   3                  4                   5                       6                    7                         8                          9

                                                                                                                                                                            

更新mid,mid=(left+right)/2=7,nums[mid]=21>18,在中间值的左区间

right=mid-1=6

第三步:

1368131618212936

      0                  1               2                   3                  4                   5                       6                    7                         8                          9

                                                                                                                

                                                                                                    

mid=5,nums[mid]=16<18;在中间值的右区间

left=mid+1=6=right

第四步:

1368131618212936

    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;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值