C语言——二分法查找一个数_数组

C语言——二分法查找一个数_数组

问题描述:

针对一个按顺序排列的一维数组,用户输入一个数,如何辨别它是否存在?是数组中的第几位?

编程思想:

采用二分法,以最中间的数和用户输入的数进行比较,逐步缩小所求数在数组中的区间,直至匹配,或得出查无此数的结论。

代码示例:

#include <stdio.h>

int main()
{
	int a[10] = {1, 3, 5, 7, 9, 10, 19, 31, 56, 101};
	int left, right, lookup, mid;
	scanf("%d", &lookup);
	
	left = 0;
	right = 9;
	if(lookup < a[left] || lookup > a[right])
	{
		printf("查无此数");
		return 0;
	}
	while(left <= right)
	{
		mid = (left + right)/2;
		if (lookup == a[mid])
		{
			printf("该数组的第%d个数为所查找数\n", mid + 1);
			break;
		}
		else if (lookup > a[mid])
		{
			left = mid + 1;
		}
		else
		{
			right = mid;
		}
		
	}
	if(left > right)
	{
		printf("查无此数\n");
	}
	
	return 0;
}
------------------------------------
解法2
------------------------------------
# include <stdio.h>

int main()
{
	int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
	int lookup;
	int w = 0;	//	初始状态我们还没找到这个数
	
	printf("请输入您要查询的数:\n");
	scanf("%d", &lookup);
	
	int l = 0;	//	数组最小初始序号
	int r = 10;	//	数组最大初始序号+1,若不如此做那么该数组的最大数就找不到
	int m;
	
	
	while((m != 0) && (m != 9))  //假设找不到的话,m的最小值为(0 + 1)/2 = 0; m的最大值为(9 + 10)/2 = 9; 
	{
		m = (l + r)/2;	//	只要偏中间就可
		if (lookup == a[m])
		{
			printf("您要查询的数在队伍内,恭喜!\n");
			w = 1;	//	说明我们找到这个数了
			break;	//	打破这尴尬的循环
		}
		else if (lookup > a[m])	//	这说明要让left = mid;	
		{
			l = m;
		}
		else
		{
			r = m;
		}
	}
	if (w == 0)
	{
		printf("很遗憾您要找的数不在查询队伍内!\n");
	}	
	
	return 0;
}

你可能感兴趣的:(C语言——二分法查找一个数_数组)