c语言_二分查找(折半查找)

ゝ一纸荒年。 2023-05-22 13:25 88阅读 0赞

A:你的新鞋子好炫酷,多少钱买的呀?
B:价格在100~300之间,你猜一下咯,每次我只告诉你猜大了还是猜小了,直到你猜对为止,看看你能不能很快猜出来。
A: ……

  小伙伴在生活中有没有和好朋友玩过类似的游戏呢,不知道接下来你会选择何种方式去猜呢?
  如果从100开始一个一个往后试,就显得稍稍有点无脑了,每次猜测的时候我们可以选择区间中间的数字,这样进行下来,我们每一次的猜测就可以排除一半的当前区间,这样是不是就快了很多呢。类似于这种折半的猜测方式,我们可以把它运用到一个有序数字串当中去,很快判断出我们的目标数字是否在其中。今天我们就用c语言代码来实现一下这个查找方法。

我们以arr[10]={0,1,2,3,4,5,6,7,8,9}和目标值key=6为例

思路图解:

在这里插入图片描述

代码如下:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. void BinSearch(int arr[],int size,int key)
  4. {
  5. int left=0; //左边界初始化
  6. int right=size-1; //右边界初始化
  7. int mid; //中间值下标
  8. while(left<=right)
  9. {
  10. mid=(left+right)/2; //每次循环先计算当前区间的中间值下标
  11. if(arr[mid]<key) //中间值小于key值的时候,说明key值在当前区间右边
  12. {
  13. left=mid+1; //我们把区间左边界更新移动到中间下标的下一个位置
  14. } //因为中间下标已经小于key值了,我们就没必要再加上它
  15. if(arr[mid]>key) //中间值大于key值的时候,说明key值在当前区间左边
  16. {
  17. right=mid-1; //我们把区间右边界更新移动到中间下标的前一个位置
  18. } //因为中间下标已经大于key值了,把右边界放到mid-1位置就行
  19. if(arr[mid]==key)
  20. {
  21. printf("找到了,下标为%d\n",mid);
  22. break;
  23. }
  24. }
  25. //要是没找见,循环结束的时候,left,right,mid在同一个位置
  26. //结束位置不等于key,我们就显示提示信息
  27. if(arr[mid]!=key)
  28. {
  29. printf("目标数没在其中!\n");
  30. }
  31. }
  32. int main()
  33. {
  34. int arr[10]={ 0,1,2,3,4,5,6,7,8,9}; //数组可以自己scanf
  35. int len=sizeof(arr)/sizeof(arr[0]);
  36. BinSearch(arr,len,6); //这里的目标数也可以自己scanf
  37. return 0;
  38. }

  sizeof是计算变量或者类型所占内存大小的关键字(返回以字节为单位的大小),sizeof(arr) (数组总共的大小)除以 sizeof(arr[0])(数组中一个元素的大小)就等于数组的元素个数。
PS:二分查找的前提是数字序列必须有序哦!

越努力,越幸福!

发表评论

表情:
评论列表 (有 0 条评论,88人围观)

还没有评论,来说两句吧...

相关阅读

    相关 二分查找(折半查找)

    二分查找 了解B+树的时候,看到了二分查找,发现自己只知道名称的意思是折半查找,却不知道是怎么去实现的。 后来查阅网上资料,发现二分查找必须要求数据是有序的,这样就