一篇文章让你弄懂二分查找

首先,我们要聊一下什么是二分查找,二分查找只适用于有序表,举个例子,一个元素1-10的数组,我要你找到元素7所在的位置,通过我们人眼观察,你可能一下子就可以找到。但是计算机这个东西,它很呆的,如果你不给予它更好的算法,它就真的会一个接一个地按顺序遍历。那么计算机就要查找七次,但是如果用了二分查找,则可以减少查找次数。

再之后,我们找left和right中间位置的元素。 

此时,我们要找的元素7比mid下标所指的元素大,所以我们可以缩小范围,只在mid~right这个区间里找元素。

 

 

此时,继续上面 mid=(left+right)/2 的步骤。

此时,下标mid指向的元素8比7大,所以,我们可以进一步缩小范围,只在left~mid的区间里寻找。

 

此时,继续上面 mid=(left+right)/2 的步骤。 

 

此时,mid指向的元素比7小,所以在mid的右边找。 

 

此时,继续上面 mid=(left+right)/2 的步骤。 

 

而此时mid下标指向的元素和7相等,则找到了。

如果,最后left>right,则说明,有序表中没有该元素。

我们可以看到,原来的需要7次查找的情况被减少到了4次。如果说这个元素更多的话,二分查找的优越性就体现出来了。

代码实现 

#include <stdio.h>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int k = 7;
	int left = 0;
	int right = sizeof(arr) / sizeof(arr[0]) - 1;

	while (left <= right)
	{
		int mid = left + (right - left) / 2;
		if (arr[mid] > k)
		{
			right = mid - 1;
		}
		else if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else
		{
			printf("找到了,下标是%d\n", mid);
			break;
		}
	}
	if (left > right)
	{
		printf("查询失败\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_63562631/article/details/131564015
今日推荐