欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C语言数据结构之二分法查找详解

程序员文章站 2021-12-14 10:42:47
问题:在有序数组中查找给定元素的下标goal。在查找一个数组元素的下标,可以用循环来解决,但是如果一个数足够大,比如说手机的价格,用循环来查找,就相当于叫一个人猜,从0开始,需要猜很久。这时候就出现了...

问题:在有序数组中查找给定元素的下标goal。

在查找一个数组元素的下标,可以用循环来解决,但是如果一个数足够大,比如说手机的价格,用循环来查找,就相当于叫一个人猜,从0开始,需要猜很久。这时候就出现了二分查找,也叫对半查找。

对半查找顾名思义就是猜一次,下次猜的内容就减少一半             

这时候定义一个变量left表示最左边元素的下标,在定义一个right表示最右边元素的下标,而mid就表示中间元素的下标。

当中间值小于目标值,left重新定义。

if (mid < goal)
		{
			left = mid + 1;
		}

当中间值大于目标元素,right重新定义。

else if (mid > goal)
		{
			right = mid - 1;
		}

当中间元素等于目标元素时,打印即可。

else
		{
			printf("你找到了,下标为:%d", mid);
			break;
		}

这中查找方式可能会使用多次,这时候来一个while循环就可以重复查找的撒

如果最后数组元素找不到对应的元素,就在while循环外打印出找不到。

	if (left > right)
		printf("找不到");

最后代码如下:

#include<stdio.h>//在数组中找到某个数,二分查找
int main()
{
	int goal = 7;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof arr[0];
	int left = 0; int right = sz - 1;
	while (left <= right)
	{
		int mid = (left + right) / 2;
		if (mid < goal)
		{
			left = mid + 1;
		}
 
		else if (mid > goal)
		{
			right = mid - 1;
		}
		else
		{
			printf("找到了,下标为:%d", mid);
			break;
		}
	}
	if (left > right)
		printf("找不到");
	return 0;
}

到此这篇关于c语言数据结构之二分法查找详解的文章就介绍到这了,更多相关c语言 二分法查找内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!