思路:
1.定左右标尺,begin和end。
2.通过左右标尺找出中值并比较
3.查找的值在中值左边则移动end 查找的值在中值右边则移动begin
注意:数组必须是按大小排序的有序数组。
public static int indexOf(int[] arr,int target){
int begin=0; //数组开始的下标(左节点)
int end=arr.length-1; //数组末尾的下标(右节点)
while(begin<=end){
int indexOfMid=begin+((end-begin)>>1);
//begin+(end-begin)/2==(begin+end)/2 第一种 写法是防止begin+end数值过大溢出
int num=arr[indexOfMid];
if(num>target){
end=indexOfMid-1;
//如果数组中间的值大于索引的数,则代表索引的数在数组的左半部分
//所以移动右节点
}
else if(num<target){
begin=indexOfMid+1;
//如果数组中间的值小于索引的数,则代表索引的数在数组的右半部分
//所以移动左节点
}
else if(num==target){
return indexOfMid;
}
}return -1;
}
测试代码:
public static void main(String[] args) {
int[] arr=new int[]{1,2,3,9,10,18,20,21};
System.out.println(indexOf(arr,9));
}
输出结果为:3