二分查找 详解(源码放在最后)

二分查找对我们初学c语言的是一个难点,从入门到放弃的第一个节点(反正我是这样),大部分人都和一开始的我一样,记住二分查找的模板然后硬套,一忘了模板什么都不知道,那我们要怎么样去摆脱这样呢?下面我来讲一下来自我自己的理解:

二分查找所引用的头文件不需要很多,只用引用一条就<stdio.h>就行,如下图:

 接下来开始写我们的main函数并定义变量,如下图:

 上图就是会用的变量,arr就是一个数组,这个数组必须是个有序数组,右下标是在数组最右边,,sz已经计算出数组里有多少元素,而下标是从‘0’开始的,所以最右边的下标应该是元素个数减一个,而最左边的下标就是‘0’,a是用来定义你想要找到哪个元素,用a定义的元素不一定是数组里面的元素;

定义完变量就要进入我们的二分查找里面的主体部分了,如下图所示:

如上图,我们要进行二分查找,是要用到循环语句,那这里可能就会有人疑惑,为什么循环条件必须是左下标小于等于右下标呢?如果当右下标比左下标小的时候,那左下标是不是就变成右下标,而右下标就变成了左下标,这就说明了,你要找的元素在这个数组里没有,那进这个循环语句就没有必要了;从while进来,我们定义了一个变量z,那为什么不在外面定义好这个z呢?z所定义的是什么?是位于中间的那个下标,如果定义在外面的话,那是不是中间的下标就只会有一个,就拿我这个数组举例,就只会等于4或者5,而我们二分查找就是需要让这个中间的下标一直变,取中间的这个下标,定义在外面不变,就只能取4或者5,就不会进行二分查找了,然后到if选择语句,如果当这个中间的下标大于我们要找的元素的下标,那是不是我们要找的元素是在数组的左边,那左下标不变,右下标到中间下标左边那一个下标,就是'z-1‘,那要是中间的下标小于我们要找的元素的下标,就与大于相反,元素在右边,右下标不变,左下标变到中间下标的右边,也就是’z+1‘,然后就开始循环往复,直到中间的下标和我们要找的元素的下标一样了,就找到目标了,’break‘就开始执行,直接跳出这个循环,如果不写这个’break‘,那这个时候左右下标是相等的,还是符合循环条件,就继续循环,进入一个死循环,如果你所输入的元素在这个数组找不到,那也不能说找不到就什么也不说,这样不行,那我们这个时候就可以往循环语句下面写这样一行代码,如下图:

 如果根据二分查找不到我需要的这个元素,那就是没有,没有的时候,根据上面的循环语句,就会让左下标大于右下标,因为左下标大于右下标,两个也不是左小右大或者相等的关系,就会跳出循环语句,不在循环,然后符合这个if语句的条件,进入这个if语句,告诉我们:”该数组没有所找目标“,到这里进入到return 0;整个程序就结束。

到这里整个二分查找的大概思路和它整个程序是怎么样去跑起来的就结束了,感谢大家的观看

源码:

int main()

    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    int a = 2;
    int sz = sizeof(arr) / sizeof(arr[0]);
    int right = sz - 1;
    int left = 0;
    while (left<=right)
    {
        int z = (left + right) / 2;
        if (arr[z] < a)
        {
            left = z + 1;
        }
        else if (arr[z] > a)
        {
            right = z - 1;
        }
        else
        {
            printf("找到目标");
            break;
        }
    }
    if (left > right)
        printf("该数组没有所找目标");
    return 0;

}
 

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

封心锁爱的前夫哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值