【二分查找】C语言实现有序数组二分查找

1.二分查找前提:

在一个整型有序的数组中查找某个指定元素

2.二分查找的思路: 
(1.)在一组数据中找到一个指定元素,假设我们从第一个元素一个一个的去查找这个指定元素的话,如果我们面临大量的数据,这样做会耗费大量内存和时间,那么二分查找就显得更加效率.
(2.)  假设一组有序数据为 {1,2,3,4,5,6,7,8,9} ;要找到指定元素8,我们知道数组首元素下标从0开始,6的下标就是5,思想就是将所有元素分成两部分,取它们的中间值与指定元素进行比较
(3.)设 首元素下标为left , 最后一个元素下标为right, 中间元素下标为 mid 即     (left+right)/2=mid (不考虑溢出)( 注意区分元素下标和元素)
第一次查找: (4)假设查找指定元素k=6,那么中间元素下标mid为4,即元素5,  5<目标值6,所以看图可知5左半部分的数据就没必要再进行比较了,此时的查找范围就变成了5的右半部分,即 (mid+1,right),所以可以将 left原来的首元素地址变成 mid+1的地址  left[mid+1] ,right的地址不变.
第二次查找:
第三次查找找到了指定元素8
同理,如果要到找的元素  < arr[mid] , 相同道理移动  right  即可

(5) 每一次都将新得到中间值元素和目标值进行比较

 将循环进行下去,会得到以下情况:

1.目标值 < 中间元素 : 目标值在中间元素的左半部分,右边right就需要移动,也就是

right=mid-1,lefe不发生移动.

2.目标值 > 中间元素 如上讲解

3.目标值==中间元素 ,那就意味着找到了指定元素,直接返回即可.

4.如果找不到元素,那就意味着 left 和 right  将会交错,变成了 left > right,此时就退出程序.

 (6)注意事项:

循环进行下去的条件必须是(left<=right)

代码如下:

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

	
	int sz = sizeof(arr) / sizeof(arr[0]);  //计算数组的长度9,下标要注意-1
	int left = 0;
	int right = sz - 1;//right=8

	while (left<=right) //left和right交错结束循环
	{
		int mid = (left + right) / 2;  //循环时,mid的值要一直重新计算
		if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else if (arr[mid] > k)
		{
			right = mid - 1;
		}
		else
		{
			printf("找到了,下标是:%d\n", mid);
			break;
		}
	}
	if (left > right)
	{
		printf("找不到\n");
	}
	return 0;
}


总结

这篇博客如果对你有帮助,给留言点个赞呗,谢谢! ! !

如有不足,还望指出

 

猜你喜欢

转载自blog.csdn.net/2201_75533641/article/details/128960390