目录
前言
二分法是我们计算机学习过程中的一个重要思想,很多同学对此理解不是很透彻,今天,小编用一篇文章带你掌握二分法
一、一个笑话
有一天阿东到图书馆借了N本书,出图书馆的时候,警报响了,于是保安把阿东拦下,要检查一下哪本书没有登记出借。阿东正准备把每一本书在报警器下过一下,以找出引发警报的书,但是保安露出不屑的眼神:你连二分查找都不会吗?于是保安把书分成两堆,让第一堆过一下报警器,报警器响;于是再把这堆书分成两堆。
最终,检测了logN次之后,保安成功的找到了那本引起警报的书,露出了得意和嘲讽的笑容。于是阿东背着剩下的书走了。
从此,图书馆丢了N-1本书。
二、二分查找思想
1.二分法介绍
就如上面的笑话一样,我们想找到那本没有登记的书,很容易想到的⽅法就是遍历书本,即一本一本的扫,但是这种⽅法效率⽐较低。
这个时候我们就可以向保安大哥学习,将书本分为两份,再扫,如此往复,就可以找出了,但是不要学那个粗心的保安哦!
我们如果将数看成一个有序的数组,这就是二分查找,也叫折半查找。
2.二分法思想
二分法查找图解,以下面这个数组(查找33)为例:
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
初始转态
第一轮查找:根据 27<33,可以判定 33 位于 27 右侧的区域,更新搜索区域为元素 27 右侧的区域。
第二轮查找:35>33,可以判定 33 位于 35 左侧的区域,更新搜索区域。
第三轮查找:31<33,可以判定 33 位于 31 右侧的区域,更新搜索区域。
第四轮查找:搜索区域内中间元素的位置是 [(6+6)/2]=6,因此中间元素是 33,此元素就是要找的目标元素。
三、代码实现
1.相关变量及其说明
int left = 0; //左下标
int right = sizeof(arr) / sizeof(arr[0]) - 1; //右下标
int key = 33;//要找的数字
int mid = 0;//记录中间元素的下标
int find = 0; //标志是否找到
2.主体思想实现
while (left <= right)
{
mid = (left + right) / 2;
if (arr[mid] > key)
{
right = mid - 1;
}
else if (arr[mid] < key)
{
left = mid + 1;
}
else
{
find = 1;
break;
}
}
3.代码展示
int main()
{
int arr[] = { 10,14,19,26,27,31,33,35,42,44 };
int left = 0; //左下标
int right = sizeof(arr) / sizeof(arr[0]) - 1; //右下标
int key = 33;//要找的数字
int mid = 0;//记录中间元素的下标
int find = 0; //标志是否找到
while (left <= right)
{
mid = (left + right) / 2;
if (arr[mid] > key)
{
right = mid - 1;
}
else if (arr[mid] < key)
{
left = mid + 1;
}
else
{
find = 1;
break;
}
}
if (1 == find)
printf("找到了,下标是%d\n", mid);
else
printf("找不到\n");
}
运行结果:
总结
这期我们详细讲解了二分查找的原理,并利用C语言进行实现,希望大家可以理解,下期见!