第三章:二分查找

7 篇文章 0 订阅
3 篇文章 0 订阅
本文详细介绍了二分查找算法,这是一种基于分治思想的高效查找方法,适用于有序数组。通过逐步缩小搜索范围,算法能快速定位目标数据。文中通过实例展示了二分查找的步骤,并提供了两种实现方式,包括迭代和递归。二分查找对于提升编程逻辑思维能力很有帮助。
摘要由CSDN通过智能技术生成

今天要学习的是二分查找。

1.介绍
二分查找跟归并与快排一样都采用了分治思想,它是在一个有序数组中查找数据。

2.方法
将一个数组的下标除以2,得到的是中间数,中间数与要查找的数据进行对比(注意这里是有序数组),如果要查找的数据比中间数大就在中间数的右边,如果小就在左边。一直循环,直到找到要查找的数据或者数组查完。

3.下面看图
在这里插入图片描述
在图中,我要查找的是44,起初m是4,left是0,right是9
第一次:m所对应的数据小于查找的数据,那我就在右边找,这时候left是5,right不变,m是7
第二次:m所对应的数据大于查找的数据,在左边找,这个时候left还是5,right就变成了6,m是5
第三次:m所对应的数据小于查找的数据,那我就在右边找,这时候left是6,right不变,m是6,这个时候整个数组也只剩下最后一个了
第四次:m等于查找的数据,查找结束,返回下标

4.代码区

#include<stdio.h>
#include<stdlib.h>

//二分查找
int BinarySearch(int * a, int len, int FindDataName)
{
	/*
	参数介绍
	a:传进来的有序数组
	len:数组的总元素个数
	FindDataNmae:需要查找的数据
	*/

	//1.先初始化起点
	int left = 0;
	int right = len - 1;
	int m = (right + left) >> 1;

	//2.开始折半查找
	while (1)
	{
		if (a[m] == FindDataName) //如果a[m]==FindDataName;退出循环并且返回下标			
			return m;
		if (left >= right)  //如果数组找完了还没有找到就返回-1
			return -1;
		if (FindDataName > a[m]) //如果查找的数据大于中间数,就在中间数的右边找
		{
			//重新定义下标
			left = m + 1;        
			m = (right + left) >> 1;
		}
		else//如果查找的数据小于中间数,就在中间数的左边找
		{
			//重新定义下标
			right = m - 1;
			m = (right + left) >> 1;
		}
		
	}

	return -1;
}

int main()
{
    int arr[10] = {11,18,22,23,25,38,44,46,52,54];
    int n= BinarySearch( a, 10, 44);
    printf("下标是%d",n);

    return 0;
}

这是最后的打印结果
在这里插入图片描述
这下标所对应的数据正好是44

下面的是递归写法。

//递归型二分查找
int  BinarySearch2(int * a,int left, int right, int FindDataName)
{
	/*
	a:传进来的数组
	left:左边开始下标
	right:右边结束下标
	FindDataName:查找的数据
	*/
	int l = left;
	int r = right;
	int m = (left + right) >> 1;

	if (FindDataName == a[m])
		return m;
	if (left >= right)
		return -1;
	if (FindDataName > a[m])
		BinarySearch2(a, m + 1, right, FindDataName);
	else
		BinarySearch2(a, left, m-1, FindDataName);	
}```

5.总结

二分查找属于经典的查找算法,重点还是要学习他的思想,对锻炼逻辑思维还是有很大帮助的。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值