public class Test {
public static void main(String[] args) {
int[]a={1,5,8,9,11,12,56,89};
int i = binarySearch(a, 56);
System.out.println(i);
}
/**
* 又叫折半查找,要求待查找的序列有序。每次取中间位置的值与待查关键字比较,如果中间位置
的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,
则在后半部分循环这个查找的过程。直到查找到了为止,否则序列中没有待查的关键字。
* @param arr
* @param b
* @return
*/
public static int binarySearch(int[]arr,int b){
if(null==arr || arr.length==0){
return -1;
}
int leftIndex=0;//查找区间的左边索引
int rightIndex=arr.length-1;//查找区间的右边索引
int mid=0;//区间的中间索引
while (leftIndex<=rightIndex){ //当左边的索引小于等于右边的索引时,可以继续取中间值
mid=(leftIndex+rightIndex)/2;//中间索引值
if(arr[mid]==b){ //如果中间索引所在的数据与需要查找的数据相等,则返回索引值
return mid;
}
if(arr[mid]>b){//b在左
rightIndex=mid-1;//如果需要查找的值在左边区间,则右边的索引要改为中间索引mid,又因为上一步知道arr[mid]!=b,所以要用mid-1作为右区间索引
}else {
leftIndex=mid+1; //b在右边,同理所以mid+1
}
}
return -1;//找不到时
}
}