【问题描述】给定一个按值有序(升序)的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
样例2
11
2,5,8,11,15,16,22,24,27,35,50
10
【样例输出】
样例1
6
16,27,22
样例2
no
16,8,11
【样例说明】
【评分标准】必须使用折半法,其他方法不能得分。
#include<stdio.h>
#include<stdlib.h>
int a[134];
int n;
int ans[123];
int cnt;
int main(){
int n;
scanf("%d",&n);
int i;
for(i=1;i<n;++i)
{
scanf("%d",&a[i]);
getchar();
}
scanf("%d",&a[n]);
int t;
scanf("%d", &t);
int l =1;
int r = n;
int mid = (l+r)/2;
ans[++cnt] = mid;
int flag = 1;
while(l<=r)
{
if(a[mid] > t)
{
r = mid-1;
mid = (l+r)/2;
ans[++cnt] = mid;
}
else if(a[mid] < t)
{
l = mid+1;
mid = (l+r)/2;
ans[++cnt] = mid;
}
else
{
printf("%d\n",mid-1);
//a[++cnt] = mid-1;
flag = 0;
break;
}
}
if(flag)
{
printf("no\n");
for(i=1;i<cnt-1;++i)
{
printf("%d,",a[ans[i]]);
}
printf("%d",a[ans[cnt-1]]);
}
else
{
for(i=1;i<cnt;++i)
{
printf("%d,",a[ans[i]]);
}
printf("%d",a[ans[cnt]]);
}
return 0;
}