设a[0],…,a[n-1]是已排好序的数组。改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。
这是C语言课程设计里的分治策略
#include <stdio.h>
#include <stdlib.h>
int a[100]={1,2,3,5,12,12,12,15,29,55};//数组中的数(由小到大)
int k;
void found(int &x,int &y,int k) //在x与y之间,要找k
{
if(x>y)return;
int m=x+(y-x)/2;
if(a[m]==k)x=y=m;
else if(a[m]>k)found(x,y=m-1,k);//找左边
else found(x=m+1,y,k);//找右边
}
int main()
{ int i=0,j=9;
scanf("%d",&k);//输入要找的数字k
found(i,j,k);//从数组a[0]到a[9]中找k
if(i==j)printf("a[%d]==%d\n",i,k);
else printf("a[%d]==%d a[%d]==%d, k==%d\n",j,a[j],i,a[i],k);
return 0;
}