当前位置:网站首页>【C语言】二分查找(折半查找)
【C语言】二分查找(折半查找)
2022-08-10 23:22:00 【山里有神明】
目录
二分查找
1.简介
二分查找也是有特殊情况的,比如数列本身是有序的。这个有序数列是怎么产生的呢?有时它可能本身就是有序的,也有可能是通过排序算法得到的。
不管其他情况,就先假设这一数组是有序的,接下来二分查找就该登场了。
二分查找(Binary Search)也叫作折半查找。二分查找有两个要求,一个是数列有序,另一个是数列使用顺序存储结构(比如数组)。
2.例子
废话不多说,直接上例子:
假设已经排序好的一组数{5,12,15,19,22,35,36,40,67,78,82}
假设我们要找的元素是k=40;
如图1,我们先找到这组数的第一个数和最后一个数的下标,定义第一个为 left,最后一个数为right,之后找到中间元素的下标 mid = left + (left+right) / 2,则 mid=35,把 mid=35 与 k=40 进行比较,发现 mid<k 并且这个数组是按照升序进行排序的,
所以可以判定如果数组中有 40 这个关键字,就一定存在于 mid 和 right 指向的区域中间。

再次遍历时需要更新 left 和 mid 的位置,令 left 移动到 mid 的下一个位置上(也就是 mid+1 的位置上),同时令 mid 重新指向 left 和 right 的中间位置。如图 2 所示:

同样,用 mid 同 k 作比较,67 < 40,所以可以判定 40 如果存在,肯定处于 left 和 mid 指向的区域中。所以令 right 指向 mid 位置左侧的一个位置上(也就是 mid-1 的位置上),同时更新 mid 的位置,如图3:

同样,用 mid 同 k 作比较,36 > 40,所以可以判定 40 如果存在,肯定处于 mid 和 right 指向的区域中。所以令 left 指向 mid 位置右侧的一个位置上(也就是 mid+1 的位置上),同时更新 mid 的位置,如图4:

当第4次做判断时,发现 mid 就是关键字 21 ,查找结束
注意:在做查找的过程中,如果 left 和 right 的中间位置在计算时位于两个关键字中间,即求得 mid 的位置不是整数,需要统一做取整操作。
3.代码如下
#include<stdio.h>
int main()
{
int arr[] = { 5,12,15,19,22,35,36,40,67,78,82 };
int k;
scanf("%d", &k);
int sz = sizeof(arr) / sizeof(arr[0]);//求数组长度
int left = 0;//第一位数
int right = sz - 1;//最后一位数
while (left <= right)
{
int mid = left + (right - left) / 2;
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.总结
通过比较折半查找的平均查找长度,同顺序查找相对比,明显折半查找的效率要高。但是折半查找算法只适用于有序表,同时仅限于查找表用顺序存储结构表示。
最后,文章到此结束啦!
边栏推荐
- 【ORACLE】什么时候ROWNUM等于0和ROWNUM小于0,两个条件不等价?
- HGAME 2022 Final writeup
- [Autumn Recruitment] [Updating ing] Hand Tear Code Series
- 房间虚拟样板间vr制作及价格
- 响应式pbootcms模板五金配件类网站
- Microsoft: Into Focus with Scott Guthrie Scott Hanselman Rajesh Jha and Kevin Scott | KEY11
- 工作记录:DB2查询数据,当字段为空时,赋值
- 腾讯云轻量应用服务器配置及建网站教程
- PlaidCTF 2022 Amongst Ourselves: Shipmate writeup
- App 启动速度优化系列:如何用一个placeholderUI来做初始化工作
猜你喜欢
随机推荐
canvas
CW617N锡青铜 CuZn40Pb2对应牌号
SurfaceView 的双缓冲
打开老项目项目的报错(以高德地图demo为例)
阿里P7晒出1月工资单:狠补了这个,真香...
CSAPP lab0 实验环境搭建
烘干衣服问题
Android | 安卓好用软件来袭,多御安全浏览器免费又强大
《剑指offer》题解——week2(持续更新)
房间虚拟样板间vr制作及价格
Blue Hat Cup 2022 web/misc writeup
生态伙伴开发实践 | 智慧检测实验室应用系统快速接入指令集数字底座
App的回归测试,有什么高效的测试方法?
2.0966 铝青铜板CuAl10Ni5Fe4铜棒
开源一夏 | 参与开源能让人更幸福
IFIT的架构与功能
(PC+WAP)带手机端pbootcms模板铝合金类网站
HGAME 2022 Week2 writeup
部分准备金银行已经过时
jsp中使用JDBC连接mysql的方法与实例









