c语言实现二分查找法

目录

一.前言

二.二分查找法

1.什么是二分查找法

2.如何用c语言来实现二分查找法

三.总结


一.前言

假如今天我们需要在一个有序的数组中来寻找一个数的下标,就用"1,2,3,4,5,6,7,8,9"这九个数组成的数组来说,假如我们想寻找'2',那很简单我们只用从小到大开始寻找,寻找两次就完成了,但是我们想寻找'7',我们继续用从小到大挨个寻找,这就显得有点慢并且耗时长还没有效率,因此我们可以有一种全新的方法,二分查找法来解决这个问题。

二.二分查找法

1.什么是二分查找法

二分查找法,又叫做折半查找法,它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列就用刚刚的数组来说,我们想寻找'7',很简单我们先用7和数组中间的数来比较大小,很明显7大于,所以我们缩小范围,从中间的右边开始继续取中间值,继续寻找,直到找到位置,这样一看找的次数少了很多,而且速度也快了不少。

2.如何用c语言来实现二分查找法

咱们来分析一下刚刚我说的找数字7的过程,首先我们需要数组的中间的数也就是中间数的下标值,那我们就需要直到数组第一个元素和最后一个元素的下标值,数组第一个元素下标值很明显是0,我们把他定义成left;这个最后一个元素的下标值我们就需要利用sizeof来计算,我们把他定义成rigth。然后两个相加,算出最中间的下标,我们把他定义为mid,和要找的数进行比较,假如大于要找的数那就从mid+1和right之间来继续刚刚的循环,假如小于要找的数那我们就从left和mid-1之间寻找。就这样一直循环,直到找到目标数为止。

代码的实现如下

void Findnum(int* arr, int key,int sz)//arr为目标数组,key为需要查找的数,sz为数组元素的大小
{//二分查找
	int  left = 0;//左边
	int right = sz-1;//右边
	while (left <= right)
	{
		int mid = (right + left) / 2;
		if (arr[mid] > key)
		{//说明key在arr[mid]和left之间
			right = mid - 1;
		}
		else if (arr[mid] < key)
		{
			left = mid + 1;
		}
		else
		{
			printf("找到了,对应的下标为:%d\n", mid);
			break;
		}
	}
	if (left > right)
	{
		printf("找不到\n");
	}
}

最后运行

 

三.总结

关于上面的过程,我们不难发现二分查找法虽然很快,但是有两个很明显的缺点,一个是他实现的条件必须是一个有序的数列,另外一个是他只能一次性找一个数而不是多个,这就让他有了很多局限性。二分查找有个很重要的特点,就是不会查找数列的全部元素,而查找的数据量其实正好符合元素的对数,正常情况下每次查找的元素都在一半一半地减少。所以二分查找的时间复杂度为

log2o是毫无疑问的。

Guess you like

Origin blog.csdn.net/weixin_64448174/article/details/122526175