当前位置:   article > 正文

为什么二分查找的边界值是中间值加1_c++二分查找补1的原因

c++二分查找补1的原因

例子

一个简单的二分查找程序

实现的功能是:从小到大输入十个数字到一个数组里,输入想要查找的数字,输出该数字在数组里的下标。如果输出的值为-1说明没有找到。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. //从小到大排列
  6. int data[10];
  7. int i;
  8. int front;
  9. int rear;
  10. int number;
  11. int mid;
  12. int result;
  13. front=0;
  14. rear=9;
  15. result=-1;
  16. for(i=0;i<9;i++)
  17. {
  18. scanf("%d",&data[i]);
  19. }
  20. scanf("%d",&number);
  21. while(rear>=front)
  22. {
  23. mid=(front+rear)/2;
  24. if(data[mid]>number)
  25. {
  26. rear=mid-1;
  27. }
  28. else if(data[mid]<number)
  29. {
  30. front=mid+1;
  31. }
  32. else
  33. {
  34. result=mid;
  35. break;
  36. }
  37. }
  38. printf("%d",result);
  39. }

现象

在这个程序中如果rear的值不是mid-1,而仅仅是mid的话,程序会有bug出现。front的处理也同理。

  1. if(data[mid]>number)
  2. {
  3. rear=mid-1;
  4. }

原因

按照C语言的规则,对int型变量进行赋值处理的时候,如果是带有小数的数字,将会自动舍弃小数点部分。

在这条语句中,mid的值按照数学运算,应该是4.5,但是由于mid是int型变量,mid会自动舍弃小数点部分,所以此时mid的值为4。

  1. int mid;
  2. mid=(0+9)/2;

 

这样的话,假设查找的内容是前半段,根据C语言的规则,mid的值会成为数值较小的那个下标,程序不会出错。

但是如果查找的内容是后半段,mid的值永远不能查找到数值最大的那个下标,会陷入死循环。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/342801
推荐阅读
相关标签
  

闽ICP备14008679号