问题描述
给定一个按值有序(升序)的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
C++代码
#include <iostream>
using namespace std;
int I=0;
int temp=0;
int b[10000];
int num=0;
void Findk(int a[], int low, int high, int k){
if(low<=high){
int mid;
mid = (low+high)/2;
b[num++]=a[mid];
if(k==a[mid]){
I=mid;
temp=1;
}else if(k<a[mid]){
Findk(a,low,mid-1,k);
}else{
Findk(a,mid+1,high,k);
}
}
}
int main(){
int n,k;
int a[10000];
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d,",&a[i]);
}
scanf("%d",&k);
Findk(a,0,n-1,k);
if(temp==0){
printf("no\n");
}else{
printf("%d\n",I);
}
printf("%d",b[0]);
for(int i=1;i<num;i++){
printf(",%d",b[i]);
}
}