折半查找(数组)

折半查找

这道题是写课后习题的时候,遇到的一个难题,花了一些时间才理解了答案,本篇是谭浩强老师课后习题的答案,只是想记录下来供以后复习,侵权删。

代码:

# include <stdio.h>

# define N 15

int main()
{
	int i, number, top, bott, mid, loca, a[N], flag = 1, sign;
	char c;
	printf("enter data:\n");
	scanf("%d", &a[0]);//输入第一个数 
	i = 1;
	while(i < N)//检查数是否已经输入完毕 
	{
		scanf("%d", &a[i]);//输入下一个数 
		if(a[i] >= a[i-1])//如果输入的数不小于前一个数 
		{
			i++;//使数的序号+1 
		 } 
		else
		{
			printf("enter this data again:\n");//要求重新输入此数 
		}
	}
	printf("\n");
	for(i = 0; i < N; i++)
	{
		printf("%5d", a[i]);//输出全部15个数 
	} 
	printf("\n");
	while(flag)//flag为开关变量,控制程序是否结束运行 
	{
		printf("input number to look for:");//问你要查找哪个数 
		scanf("%d", &number); //输入要查找的数
		sign = 0;//sign为0表示尚未找到
		top = 0;//top是查找区间的起始位置
		bott = N - 1;//bott是查找区间的最末位置
		if((number < a[0]) || number > a[N - 1])//要查的数不在查找区间内 
		{
			loca = -1;//表示查不到 
		} 
		while((!sign) && (top <= bott))
		{
			mid = (bott + top)/2;//找出中间元素的下标 
			if(number = a[mid])//如果要查找的元素正好等于中间元素 
			{
				loca = mid;//记下该下标 
				printf("Has found %d, its position is %d\n", number, loca+1);
				//由于下标从0算起,而人们习惯了从1算起,因此输出数的位置要加1
				sign = 1; 
			}
			else if(number < a[mid])//如果要查找的数小于中间元素的值 
			{
				bott = mid - 1;//只需在下标为0~mid-1的元素中找 
			}
			else//如果要查找的数不小于中间元素的值 
			{
				top = mid + 1;//只需在下标为mid+1~bott的元素中找 
			}
		} 
		if(!sign || loca == -1)//sign = 0或loca = -1时表示找不到 
		{
			printf("connot find %d. \n", number);//输出找不到 
		 } 
		printf("continue or not(Y/N)?");//问是否继续查找 
		scanf("%c", &c);//不想查找输入N或n 
		if(c == 'N' || c == 'n')
		{
			flag = 0; 
		 } 
	}
	

​```
return 0;
​```

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值