一.概念
前提,在一个有序序列中,寻找与目标元素相等的元素。
确定该序列区间的中间位置K,将查找的值T与array[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。区域确定如下:a.array[k]>T 由数组的有序性可知array[k,k+1,……,high]>T;故新的区间为array[low,……,K-1]。b.array[k]<T 类似上面查找区间为array[k+1,……,high]。每一次查找与中间值比较,可以确定是否查找成功,不成功当前查找区间将缩小一半,递归查找即可。时间复杂度为:O(log2n)。
二.递归实现
一定要注意边界的判断,如果目标值不在序列中,随着持续二分,最后low+1=high;再找不到则low会与high相等,middle=low;再找不到则low>high,此时要结束二分查找。
public static int binarySearch(int elem,int[]array,int low,int high){
int middle = (low+high)/2;
if (low<high){
return -1;
}
if (array[middle]==elem){
return middle;
}
if (array[middle]>elem){
//在左边找
binarySearch(elem,array,low,middle-1);
}
if (array[middle]<elem){
//在右边找
binarySearch(elem,array,middle+1,high);
}
return -1;
}
public static void main(String[] args) {
int[]array=new int[]{0, 9, 7, 8, 6, 5, 4, 3, 2, 1};
ExchangeSortFast.sort(array,1,array.length-1);
for (int k=0;k<array.length;k++){
System.out.print(array[k]+"\t");
}
int i = directBinarySearch(5, array, 1, array.length - 1);
System.out.println("位置"+i);
}
三.非递归
public static int directBinarySearch(int elem,int[]array,int low,int high){
while (low<high){
int middle=(low+high)/2;
if (elem<array[middle]){
high=middle-1;
}else if (elem>array[middle]){
low=middle+1;
}else {
return middle;
}
}
return -1;
}