设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素位置i和大于x的最大元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。
下面是将要被改写的二分搜索算法
public static int binarySearch1(int []a,int x,int n){
int left = 0;int right = n-1;
while(left<=right){
int middle = (left+right)/2;
if(x==a[middle]) return middle;
if(x>a[middle]) left= middle-1;
else right = middle;
}
return -1;
}
改写后的二分搜索算法
public class BinarySearch {
public static int[] binarySearch(int[] a, int x, int left,int right, int[] b){
int i;int j;
while(left<=right){
int middle = ( left + right ) / 2;
if (x==a[middle]){
i=j=middle;
b[0]=i;
b[1]=j;
return b;
}
if (x>a[middle])
left=middle+1;
else
right=middle-1;
}
i=right;j=left;
b[0]=i;
b[1]=j;
return b;
}
public static void main(String[] args) {
int []a= {1, 2, 3, 4, 5,6, 7,8, 9};
int n=a.length;int i=0; int j=0;
int left=0;int right=n-1;
int []b=new int[2];
int x=-1;
binarySearch(a,x,left,right,b);
if (x<a[left]){
System.out.println("x比数组的最小值还要小,大于x的最小元素的位置位于数组中的第1位");
}else if(x<=a[right]){
if (b[0]==b[1])
System.out.println("该元素位于数组中的第"+(b[0]+1)+"个");
else {
System.out.println("该元素不在数组中");
System.out.println("小于x的最大元是第"+(b[0]+1)+"个");
System.out.println("大于x的最小元是第"+(b[1]+1)+"个");
}
}else{
System.out.println("x比数组的最大值还要大,小于x的最大元素的位置位于数组中的第"+(n+1)+"位");
}
}
}