如何将折半查找应用于范围查找?

如何将折半查找应用于范围查找?范围查找就是对于一个有序的数组,找出位于给定值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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值