【问题描述】给定一个按值有序(升序)的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<iostream>
using namespace std;
const int MAX = 100;
int* b = new int[MAX]; //标记数组,记录检索路径
int s = 0; //标记数组长度
template<class T>
void bisearch(T *a, int left,int right,T x) {
int middle = (left + right) / 2;
if (x == a[middle]) {
b[s++] = a[middle];
cout<< middle<<endl; //输出最终位置
}
else if (left > right)
{
cout <<endl<< "no"<<endl;
}
else if (x > a[middle]) {
b[s++] = a[middle];
bisearch(a, middle+1, right, x);
}
else if (x < a[middle]) {
b[s++] = a[middle];
bisearch(a, left, middle - 1, x);
}
}
int main() {
int n, k; char ch;
cin >> n;
int* a = new int[n];
//去除输入中的逗号
for (int i = 0; i < n; i++) {
cin >> a[i]; cin.get(ch);
}
cin >> k;
bisearch(a, 0, n-1, k);
for (int i = 0; i <s-1; i++) {
cout << b[i] << ",";
}
cout << b[s-1];
}