【问题描述】
给定一个按值有序(升序)的N元整数数组A,采用折半查找法查找关键值k的位置,并给出查找的过程
【输入形式】
第一行:N
第二行:A[0], A[1], ... , A[N-1]
第三行:k
【输出形式】
第一行:k的位置(索引),若不存在则输出'no'
第二行:查找的过程,每一次折半的中间(mid)位置的值,以逗号分隔。例如,1 2 3 4 5的中间位置为3,1 2 3 4的中间位置为2。
【样例输入1】
11 2,5,8,11,15,16,22,24,27,35,50 22
【样例输出1】
6 16,27,22
【样例输入2】
11 2,5,8,11,15,16,22,24,27,35,50 10
【样例输出2】
no 16,8,11
【样例说明】
【评分标准】
必须使用折半法,其他方法不能得分。
题解:
#include<stdio.h>
int BinarySearch(int s[],int b[],int key,int* k,int n)
{
int low,high,mid,len=0;
low=0;
high=n-1;
while(low<=high)
{
mid=(low+high)/2; //计算中间元素序号
b[len]=s[mid];
len++;
if(s[mid]==key) //中间元素与关键字相等
{
return mid;}
else if(s[mid]>key) //中间元素大于关键字
{
high=mid-1;
}
else
{
low=mid+1;
}
*k=len;
}
return -1; //查找失败返回-1
}
int main()
{ int b[10];
int a[20];
int i,pos,key;
int k;
scanf("%d",&i);
for(int j=0;j<i;j++)
{scanf("%d",&a[j]);
getchar();
}
scanf("%d",&key);
pos=BinarySearch(a,b,key,&k,i);
if(pos>=0)
printf("%d\n",pos);
else
printf("no\n");
//printf("%d\n",k);
//printf("%d\n",i);
//printf("%d",b[1]);
for(int j=0;j<=k;j++)
{
if(j==0)
printf("%d",b[j]);
else
if(b[j]==0)
break;
else
printf(",%d",b[j]);
}
return 0;
}