C语言中二分法的简单理解

C语言中二分法的简单理解C语言中二分法的简单理解

二分法介绍

        当我们想要在一个有序数组中查找某一个数据时,除了按顺序一个一个查找外,还可以通过二分法进行查找,特别是在含数据较多的数组中查找时,二分法的效率可能会更高。

        所谓二分法,其实就是每一次拿要找的数和数组中间的数进行比较,举个例子,现在有1到10十个数,如果要查找的数是7,那么二分法会先和5进行比较,因为7比5大,所以查找的范围就变成了6到10,直接排除了一半的数组,在以此类推,直到找到7为止。


编写过程中遇到的问题

在初次编写二分法程序的过程中,我发现了一个问题。

#include <stdio.h>

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("请输入1-10之间的整数:");
	int input = 0;
	scanf("%d", &input);
	int left = 0;
	int right = (sizeof(arr) / sizeof(int)) - 1;
	for (;;)
	{
		int mid = (left + right) / 2;
		if (input > arr[mid])
		{
			left = mid;
		}
		else if (input < arr[mid])
		{
			right = mid;
		}
		else
		{
			printf("找到了,是第%d个\n", mid + 1);
			break;
		}
	}
	return 0;
}

        但是在检验过程中发现,该方法是无法查找到数组中最大的数10的。检查了一遍发现,因为mid的类型是int,在进行最后一步查找时,left变成了8,right是9,(8+9)/2在int类型里等于8,所以永远不能找到最后一位数,改进之后:

#include <stdio.h>

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("请输入1-10之间的整数:");
	int input = 0;
	scanf("%d", &input);
	int left = 0;
	int right = (sizeof(arr) / sizeof(int)) - 1;
	for (;;)
	{
		int mid = (left + right) / 2;
		if (input > arr[mid])
		{
			left = mid + 1;
		}
		else if (input < arr[mid])
		{
			right = mid - 1;
		}
		else
		{
			printf("找到了,是第%d个\n", mid + 1);
			break;
		}
	}
	return 0;
}

        在原先的代码中,如果input > arr[mid],那么就执行 left=mid ,拿1到10的例子说,left是等于mid等于(0+9)/2=4(注意这里4是下标),这样下一次查找的范围就是从5到10,而改进后变成left=mid+1; 则下一次查找范围变成了6到10,提高了效率,在查找10时,也变成了(9+9)/2=9; 不存在找不到最后一位的情况。

今天的文章C语言中二分法的简单理解分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/24144.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注