问题描述:给定数组a[0 : 8]={1, 8, 12, 15, 16, 21, 30, 35, 39}。采用二分搜索算法完成下述任务:当待搜索元素x=10不在数组中时,返回小于 x 的最大元素位置 i 和大于 x 的最小元素位置 j 。
变量定义:左指针lo,右指针hi,中间指针mid
解决方案:找不到x可以分两种情况讨论:
<1>lo的位置在hi的右边,即lo>hi,那么这时hi的位置就是小于 x 的最大元素位置 i ,而lo的位置就是大于 x 的最小元素位置 j
<2>lo与hi位置相同,那么这个元素如果比x大,那i的位置在这个位置的前一个,如果这个元素比x小,那么j的位置在他的后一个。
package search;
public class BinarySearch {
public static int binary(int[] a,int lo,int hi,int n) {
int i=0,j=0; //小于n的最大元素位置i,大于n的最小元素位置j
while(lo<hi) {
int mid=(lo+hi)/2; //当lo>hi时,循环跳出,这时lo指针的位置就是大于n的最小元素位置j,hi指针
if(a[mid]<n) {lo=mid+1; j=lo;} //的位置即小于n的最大元素位置
else if(a[mid]>n) {hi=mid-1; i=hi;}
else
return mid;
}
if(lo==hi) { //如果lo和hi指针指向同一个元素就会存在以下两种情况
if(a[lo]>n) i=j-1; //如果指向的这个元素大于n说明它的前一个元素即小于n的最大元素
else if(a[lo]<n) j=i+1; //如果指向的这个元素小于n说明它的后一个元素即大于n的最小元素
}
System.out.print(i+","+j);
return -1;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a= {1, 8, 12, 15, 16, 21, 30, 35, 39};
int hi=a.length-1;
binary(a,0,hi,10);
}
}

京公网安备 11010502036488号