如何将折半查找应用于范围查找?范围查找就是对于一个有序的数组,找出位于给定值L,U之间(包含L,U)的所有元素,L<=U。
#include<iostream>
using namespace std;
int BinarySearchL(int a[],int b,int e,int k);
int BinarySearchR(int a[],int b,int e,int k);
void RangeBinarySearch(int a[], int l, int u, int b,int e)
{
if(b <= e)
{
if(l > u) //l>u 则交换
{
swap(l,u);
}
int mid = (b+e)/2;
if(a[mid] < l ) //如果a[mid] < l,则在左边查找
{
RangeBinarySearch(a,l,u,mid+1,e);
}
else if(a[mid] > u ) //如果a[mid] > u,则在右边查找
{
RangeBinarySearch(a,l,u,b,mid-1);
}
else //如果正好落在中间,则找出左边界和右边界
{
int b1 = BinarySearchL(a,b,mid,l); //左边界
int e1 = BinarySearchR(a,mid,e,u); //右边界
for(int i=b1; i<=e1; ++i) //输出
{
cout<<a[i]<<' ';
}
cout<<endl;
return;
}
}
else
{
cout<<"there is no values fall between "<<l<<"and "<<u<<endl;
return;
}
}
int BinarySearchL(int a[],int b,int e,int k)
{
if(b <= e)
{
int mid = (b+e)/2;
if(a[mid] == k)
{
while((mid>=b) && (a[mid] == k))
{
mid--;
}
return ++mid;
}
if(a[mid] > k)
{
if(mid == b)
return mid;
else if(a[mid-1]<k)
return mid;
else
return BinarySearchL(a,b,mid-1,k);
}
if(a[mid] < k)
{
if(a[mid+1]>k)
return mid+1;
else
return BinarySearchL(a,mid+1,e,k);
}
}
else
{
return b;
}
}
int BinarySearchR(int a[],int b,int e,int k)
{
if(b <= e)
{
int mid = (b+e)/2;
if(a[mid] == k)
{
while((mid<=e) && (a[mid] == k))
{
mid++;
}
return --mid;
}
if(a[mid] < k)
{
if(mid == e)
return mid;
else if(a[mid+1]>k)
return mid;
else
return BinarySearchR(a,mid+1,e,k);
}
if(a[mid] > k)
{
if(a[mid-1]<k)
return mid-1;
else
return BinarySearchR(a,b,mid-1,k);
}
}
else
{
return e;
}
}
int main()
{
int a[10] = {1,3,5,7,9,11,13,15,17,19};
RangeBinarySearch(a,27,29,0,9);
return 0;
}