一篇文章教你学会二分查找(C语言)

目录

前言

一、一个笑话

二、二分查找思想

1.二分法介绍

2.二分法思想

三、代码实现 

 1.相关变量及其说明

 2.主体思想实现

 3.代码展示

总结


前言

二分法是我们计算机学习过程中的一个重要思想,很多同学对此理解不是很透彻,今天,小编用一篇文章带你掌握二分法


一、一个笑话

        有一天阿东到图书馆借了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语言进行实现,希望大家可以理解,下期见!

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值