二分查找法

二分查找法也成为折半查找法,这方法,只可以用在有序的数组中,不能用在无序的数组中。

二分查找可以帮我们很好的查找数组中的任何一个数,简易,浪费时间少。

就比如给个题:比如下面这十个数组中让我们,找7这个数字。

arr[ ] = {1,2,3,4,5,6,7,8,9,10 };

我们先吧大概的思路说一下: 

  • 我们先把这10个数字的下标表出来
  • 最前边下标为left(左下标),最后下标为right(右下标),这两个的平均值作为我们的中间元素的下标
  • 最前面的下标和最后面的下标互相加了以后除以2,得到中间元素。

最前面的下标是0,最后面要是不知道,利用这个公式可以找到:

元素个数     sz = sizeof(arr)/ sizeof(arr[0]);

                  总元素大小(字节)/   一个元素大小(字节)

                          10*4                /                4           =      10(个元素) 

找到元素个数  以后,10个元素他的右下标肯定9

  • 把左下标和右下标加起来除以2后得到的中间元素:(0+9)/2 = 4
  • 4作为我们新的下标(把他称为mid),他对应的元素是5,我们本来要找的元素是7,和我们来比较,我们新找出的元素5,5是小于我们要找的7元素,所以说明我们要找的数字7 ,在5的右边。这样我们要查找的变成了6-10.
  • 我们的left 就到这儿了。
  • 所以我们没必要5的右边找7,所以我们把本来我们定的左下标left移动到5元素对应的下标去。
  • 本来我们中间元素下标(mid)是4,这下我们要查的下标范围5(元素是6),所以我们可以这样写:(5 了)left = mid(本来是4) +1,这样我们新的下标就出来了,那就是5,它对应的元素是6。查6-10   这里left 元素是6
  • 我们再判断,再把左下标和右下标加起来除以2:(5+9)/2 = 7。我们再把7作为新的mid
  • 这样我们的新下标出来了,它对应的元素是8,我们判断8和我们要找的7要大。
  • 这说明,我要找的元素mid左边,(8的左边 )
  • 这样我们left 不再变,right要变,他变到8的左边,7的下标我们新的right
  •   最后我们要找的7 元素是的位置在6-7了
  • 这样我们再判断 5和6 了    (5+6)/  2 =    5  这是我们新的mid,它对应的元素6
  • 6是我们要找的7要小,是在6的右边,这样我们要找的元素只能是7了。left 新的小标有了
  • 这样我们left 和right 都指向一个7的下标了,刚刚我们做下标是5,right 新下标是6
  • 我新的做下标是left = (5)mid +1 = 6 (新下标)
  • (6 +6) / 2 = 6  作为新的mid ,对应元素7 ,哎这样我们找到了。

代码示例:

#include<stdio.h>
{
    char arr[] = {1,2,3,4,5,6,7,8,9,10};

    int k = 7;
        //查找k
        
        int left = 0;
        int right = sizeof(arr) / sizeof(arr[0]);
        int mid = (left + right) / 2 ; //中间元素的下标
        
         while(left<=right)
        {
             if(arr[mid] < k)
        {
            left = mid + 1;
            
        }
        else if(arr[mid] < k)
        {
            right = mid - 1;
        }
        else
        {
            printf("找到了,下标 是:%d\n",mid);
            break;
        }
       
        }
            
if(left>right)
{
    printf("找不到了\n");
}
            return 0;
        }
       

 

 

 

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值