【C语言】二分法查找——————细节讲解

简介: 概念二分法查找,是一种在有序数组中快速目标数字的一种算法,也可以叫做折半查找。要掌握二分法查找,首先我们要明白二分法查找是怎么运作的,为什么要用二分法查找。
  • 概念

二分法查找,是一种在有序数组中快速目标数字的一种算法,也可以叫做折半查找

要掌握二分法查找,首先我们要明白二分法查找是怎么运作的,为什么要用二分法查找。02de1e57a19642f1ac4929ad6644ff45.png

  • 这里有一个数组,共有十个元素,我们想找到其中一个元素,按照传统遍历的办法,我们写一个循环那么最多要循环十次,但是如果我们用二分法查找的话最多只用4次循环就可以做到。
    传统办法代码示例:
  int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };//定义数组
  int n = 0;
  scanf("%d", &n);//输入要查找的数字
  for (int i = 0; i < 10; i++)//从头到尾遍历查找
  {
    if (arr[i] == n) 
    {
      printf("找到了,位置在下标%d", i);
      break;
    }
  }

二分法查找讲解

2e54ba0dbc6144a7a3ffe0f00a1f10f5.png

二分法查找的精髓就是如果没查询到,下次将数据折半再进行查找,大大提高效率,,那么如果想砍掉一半数据,最重要的就是找到中间的数字,比如下图,我们想找的是2,那么我们先拿到中间数字5与2进行比较,5比2大,所以要找的肯定不是5右面的数(因为是有序数组),所以将5右面的数包括5一起pass掉

9bb5dc9b08604bc0931584f3ac27063a.png

接下来我们继续在下标0-3的数字上进行查找中间数字为2,查找成功。

  • 对于定位中间数,我们可以采用 最大的下标+最小的下标/2

于是便有了二分法查找必不可少的三个变量

left始化为0,因为最小的下标肯定是0
right ,sizeof(arr) / sizeof(arr[0]) - 1
mid ,(left + right) / 2,其中left和right的存在都是为了找出mid

  • 有了这三个变量,问题就变得简单了,只要每次折半后修改left或者right的位置,然后产生新的mid,二分法查找就写好了
#include <stdio.h>
int main()
{
  int arr[10] = { 11,22,33,44,55,66,77,88,99,101 };//定义要查找的数组
  int sz = sizeof(arr) / sizeof(arr[0]);//数组大小
  int left = 0; //关键变量left用于定位范围左边
  int right = sz - 1;//关键变量right用于定位范围右面
  int mid = left + (right - left) / 2;//关键变量mid用于定位范围中间
  int input = 0;
  int flag = 0;//标记循环结束后是否找到数字
  scanf("%d", &input);//输入要查找的数字
  while (left <= right)
  {
    if (input > arr[mid])//如果要查找的数字大于中间数,砍掉左半边
    {
      left = mid + 1;//将左范围更正到原mid右一位
      mid = left + (right - left) / 2;//将范围中间数更新
    }
    else if(input <arr[mid])//如果要查找的书数字小于中间数,砍掉右半边
    {
      right = mid - 1;//更新右范围为原mid左一位
      mid = left + (right - left) / 2;//将范围中间数更新
    }
    else//如果既不大于也不小于,则为等于,找到数字    
    {
      flag = 1;//将标记改为1
      printf("找到了坐标为%d",mid);
      break;//跳出程序
    }
  }
  if (flag == 0)//如果标记在循环中没有被修改,则证明没找到
  {
    printf("没找到");
  }
}

总结

二分法查找其实很简单,主要就是找到中间数,每次进行折半即可。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3EXSYx5O-1677661166102)(https://img-home.csdnimg.cn/images/20220524100510.png =60x60)]
















相关文章
|
2月前
|
算法 C语言
【C语言】斐波那契数列细讲
【C语言】斐波那契数列细讲
|
2月前
|
存储 算法 C语言
【C语言】二分查找算法
【C语言】二分查找算法
|
2月前
|
搜索推荐 C语言 C++
【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)
【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)
|
C语言
【C语言实现二分查找法】
【C语言实现二分查找法】
49 0
|
7月前
|
C语言
C语言:指针典型例题剖析
C语言:指针典型例题剖析
|
C语言
双链表-纯C语言(代码以及详细解释)下
双链表-纯C语言(代码以及详细解释)
44 0
|
C语言 计算机视觉
双链表-纯C语言(代码以及详细解释)上
双链表-纯C语言(代码以及详细解释)
97 0
|
算法 C语言
九分钟带你弄懂KMP算法【C语言实现篇】
定义一个函数,传入参数为两个字符串,以及一个pos(表示从主串str的哪个位置开始搜寻子串pat)
243 0
|
C语言
线性查找(C语言实现)
线性查找(C语言实现)
128 0
|
C语言
C语言练习之二分法
C语言练习之二分法
85 0