折半查找法

试编写一个程序完成:有15个数按从下到大的顺序存放在一个数组中.输入一个数,要求折半查找法找出该数是数组中第几个元素的值.如果该数不在数组中,输出“不在表。

实验要求: 输入事先已编好的程序,并运行该程序。分析运行结果是否正确。

#include<stdio.h>
#define N 15
//符号常量,用#define指令,指定用一个符号名称代表一个常量
//通常大写,句末没有分号 
int main()
{
	int i,number,top,bott,mid,loca,a[N],sign,flag=1;
	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++;  //使数的序号加一 
		else
		printf("enter this data again:\n");//要求重新输入此数 
	}
	printf("\n");
	for(i=0;i<N;i++)
	printf("%5d",a[i]); //输出全部十五个数 
	printf("\n");
	while(flag)   //为什么放一个flag在括号里 
	{
		printf("input number to look for:\n"); //问要查找哪个数 
		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))//不懂!sign什么意思,&&是与
		{
			mid=(top+bott)/2; //找出中间元素的下标 
			if(number==a[mid]) //若要查找的数刚好等于中间元素 
			{
				loca=mid;
				printf("Has found %d,its position is %d\n",number,loca+1);
				//由于下标从0算起,所以输出的数位置要加一
				sign=1; //表示找到了 
			}
			else if(number<a[mid]) 
			bott=mid-1;
			else if(number>a[mid])
			top=mid+1; 
		 } 
		if((!sign)||loca==-1) //sign为0或loca为-1,意味着找不到。||或。 
	    	printf("找不到 %d.\n",number); //输出找不到 
        printf ("continue or not(Y/N)?");  //问是否重新查找 
		scanf("%c",&c);
		if(c=='N'||c=='n')  //不想继续查找就输入n或N 
		flag=0;	 //flag为开关变量,控制程序是否结束运行 
		printf("\n");
	 } 
	 return 0;
}

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值