//这个。。。。我觉得应该是对的........
设A为n个不同的数排好序的数组,给定数L和U,L<U,问:找到A中所有满足L<x<U的所有的数x。
算法思想:在A中使用二分查找算法找L。如果L=A[i],找到L的位置i,然后把i加1;如果L不在A中,那么找到大于L的最小数的位置i。
类似地,在A中使用二分法算法查找U,找到U所在的位置j,然后j减1;如果U不在A中,那么找到小于U的最大数的位置j。
最后输出A中从i到j的全体数。
有可能区间没有 比如[12, 12]应该是空 但是我没加...还有输入不规范之类的,也没考虑
#include <iostream>
using namespace std;
int tmp = 1;
int n, L, U;
int BinarySearch(int A[],int x, int l, int r)
{
int mid = (l + r) / 2;
cout<< x <<" " << l << " " << r << " " << A[mid]<< endl;
if (x == A[mid])
return mid+tmp;
else if (l == r || l == r-1) {
// cout << l << tmp << endl;
return (x-A[mid])>0 ? ((l-tmp)<n-1? mid+(tmp+1)/2 : n-1) : 0;//边界情况 找的都是小值 所以左边界...
// return (l-tmp)>-1 ? ((l-tmp)<n? mid+(tmp+1)/2 : n-1) : 0;//边界情况 找的都是小值 所以左边界...
}
return (x > A[mid]) ? BinarySearch(A, x, mid + 1, r) : BinarySearch(A, x, l, mid-1);
}
int main()
{
cout << "请输入数组A的元素个数n" << endl;
cin >> n;
int *A = new int[n];
//读入A
cout << "请输入" << n << "个顺序的数组元素:" << endl;
for (int i = 0; i < n; i++)
cin >> A[i];
while(1){
cout << "请输入L和U"<<endl;
cin >> L >> U;
tmp = 1;
int l = BinarySearch(A, L, 0, n-1);
tmp = -1;
int r = BinarySearch(A, U, 0, n-1);
cout << "l="<<l <<" "<<"r="<< r<<endl;
for (int i = l; i <= r; i++)
cout << A[i] << " ";
cout << endl;
}
return 0;
}