二分查找是一种高效的查找算法,其基本思想是,在一个有序的数组中,先和数组最中间的值进行比较,如果小于最中间的这个值,则将查找范围缩小为左半部分,大于则将查找范围缩小为右半部分,每次缩小一半的查找范围,直至找到与这个数相等的数。当数据量比较大的时候,二分查找相对于顺序查找,显示出明显的优势。
下图为二分查找的一个示例
接下来我们对二分查找进行实现,本文介绍两种实现方法。
while循环法
public static int rank(int key,int[] a){
int lo = 0; //最低位
int hi = a.length-1; //最高位
while(lo<hi){
int mid = lo+(hi-lo)/2; //求出中间位
if(key<a[mid])
hi = mid-1;
else if(key>a[mid])
lo = mid+1;
else
return mid;
}
return -1;
}
递归法
public static int rank(int key,int[] a,int lo,int hi){
if(lo<hi){
int mid = lo+(hi-lo)/2;
if(key==a[mid])
return mid;
else if(key<a[mid])
return rank(key,a,lo,hi-1);
else
return rank(key,a,lo+1,hi);
}
else
return -1;
}