一、题目要求

在一个有序数组中,查找某一个数字,如果能找到,则输出它的下标,如果找不到,输出该数字不存在。

二、解题思路

有一种简单的方法是遍历整个数组,但是这种方法的时间复杂度较高,且逼格不够高。所以我们采用一种较为高级的方法。

二分法,顾名思义,就是把数组分成两部分,每次都分成两部分,这样一下子就能缩小一半的范围。为了便于大家理解,这里我举个栗子:你买了一杯饮料,并且说价格在20之内。让我猜多少钱,那我肯定会先猜10元,然后你说猜低了,那我就会再猜15元,这时你又说猜高了,那我就会猜12元,然后再问几次,这时就可以猜出饮料的价格了。这种从中间折半猜价格的方法就是二分法。

画个图便于大家理解:

粉色的数字⭕️1,代表第一次猜的价格,

粉色的数字⭕️2,代表第二次猜的价格,

粉色的数字⭕️3,代表第三次猜的价格,

在图里可以发现,范围是一半的在缩小,二分法也是这样的原理。

三、代码解题

#include <stdio.h>
int main()
{int input = 0;              //初始化要查找的数字int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//创建一个有序数组printf("请输入你要查找的数字->");scanf("%d", &input);int sz= sizeof(arr) / sizeof(arr[0]);//sz是数组的长度//sizeof这个函数是用来求数组的长度的,单位是字节。//sizeoff(arr)求出这个数组的总长度,sizeoff(arr【0】)求出一个字符的长度//总长度/一个字符的长度 ,求出这个数组有多少个元素int left = 0;    //left是最左边元素的下标int right = sz-1;//right是最右边元素的下标,因为数组元素是从0开始,所以要减1while (right >= left){int mid = ((right + left) / 2);  //mid是中间元素的下标if (input > arr[mid]){left = mid + 1;//如果要查找的数字比中间数字大,比如要在1-10之间查找7,//7比中间元素5大,那么就要右边的范围,原本最右边的元素不变,原本的//中间元素加1,变成新的左边元素,这样就确定了新的范围}else if (input < arr[mid]){right = mid - 1;//如果要查找的数字比中间数字小,比如要在1-10之间查找3,//3比中间元素5小,那么就要左边的范围,原本最左边的元素不变,原本的//中间元素减1,变成新的右边元素,这样就确定了新的范围}else{printf("下标是:%d\n", mid);//除了上述两种情况,只剩下要查找数字等于中间元素,//那么中间元素的下标就是要找的数字的下标break;}}if (right < left)printf("不存在");return 0;}

四、其他

如果有什么不明白的地方在下方评论,欢迎指正。

C语言实现二分法查找某个数字(超详细)相关推荐

  1. 【C++】二分法查找某个数字在数组中的下标

    #include<iostream> using namespace std;//利用二分法查找某个数字在数组中的下标 int search(int arr[], int k, int s ...

  2. 【排序】什么都能排的C语言qsort排序详解【超详细的宝藏级别教程】深度理解qsort排序

    [排序]什么都能排的C语言qsort排序详解[超详细的宝藏级别教程]深度理解qsort排序 作者: @小小Programmer 这是我的主页:@小小Programmer 在食用这篇博客之前,博主在这里 ...

  3. 【C语言】操作符详解(超详细)

    hello~~,我是~小鹿,超级详细的操作符讲解来康康吧 可以收藏随时找到这里哦~ [C语言]操作符详解(超详细) 1.算数操作符:+,-,*,/,% 2.位移操作符:<< , >& ...

  4. 我的Go+语言初体验——(1)超详细安装教程

    我的Go+语言初体验--(1)超详细安装教程 "我的Go+语言初体验" | 征文活动进行中- Go+ 是什么?为数据而生,实现教学.工程与数据的 "三位一体". ...

  5. C语言实现链表的基本操作(超详细注释)

    第一次学数据结构的时候,c语言基础实在太差,在尝试用c语言来实现的时候一直碰壁,数据结构书里的代码是伪代码,使用的时候各种内存访问冲突,各种锟斤拷烫烫烫,各种变量级别不同.于是我又重新学了一遍c语言, ...

  6. C语言折半查找法(超详细)

    折半查找法仅适用于对已有顺序的数组.数据进行操作!!!(从小到大)自我总结:折半查找法就是相当于(通过改变low或high的大小)把中间位置指到了key那个数那里,所以mid应该处于循环里面,即mid ...

  7. C语言字符、字符串函数(超详细版)

    目录 strlen函数 三种方法模拟实现: 1.计数器: 2.指针 - 指针 3.函数递归 strcpy函数 strncpy函数 strcat函数 strncat函数 strcmp函数 strncmp ...

  8. php图书管理系统源码详细设计,C语言程序设计:图书管理系统(超详细有登录系统,附代码和试验报告)...

    C课程设计--图书管理系统 1.题目意义 图书馆,作为文献的聚集地和展示平台,常常扮演着引领文化前进的角色,是每个大学不可或缺的基础设施,而图书管理系统则是一个图书馆能够正常运转的关键.本次课程设计使 ...

  9. c++语言运算符,C++关系运算符(超详细)

    计算机擅长比较值以确定其中一个是否大于.小于或等于另一个.这些类型的操作很有价值,例如,它可以检测销售图表.确定收益和损失.对比数字以确保其在可接受的范围内以及验证用户给出的输入等. 在 C++ 中比 ...

最新文章

  1. 教程:12、文件存储结构
  2. 我为什么看好IPFS
  3. android 应用程序框架
  4. java线程安全问题原因及解决办法
  5. python面试题总结(2)--编码规范
  6. h5课件制作_PPT新功能!竟然还能用来制作H5
  7. Java之LockSupport详解
  8. javascript中的原型
  9. 【UVa】Wavio Sequence(dp)
  10. display:none与visible:hidden的区别 ?
  11. MoveIt China Developer Workshop
  12. 阿里巴巴矢量图标引入方法
  13. 数字图像处理——灰度变换
  14. nxp_3|虚拟机Linux内核资源
  15. 解决Appium Desktop 测试中,元素不能准确定位的问题
  16. 京剧《赤壁》舌战群儒
  17. [转]一款可以反编译jar包的java反编译工具-JD-GUI(绿色软件)
  18. 前端实现小型打包工具
  19. AS5245磁性角度传感器
  20. 删除顽固的文件夹--删不掉的文件夹update处理方法

热门文章

  1. 写一款汽车维修保养软件,让维修保养管理更加轻松,JavaScript 作用域
  2. penssl-devel 安装依赖
  3. 面试笔试中算法设计问题的回答技巧总结
  4. std::floor和std:ceil简述
  5. EasyRoads3D使用教程
  6. linux操作系统:x86架构,一个良好的运营环境
  7. 创建具体的产品,并继承产品抽象类
  8. 金三银四铜五铁六,面试得做好这个准备
  9. 实验五:常见WEB漏洞挖掘与利用
  10. Java有关于面向对象中的【抽象类、抽象方法和多态】的解释(初学者)