01_二分查找
binarySearch
public static int binarySearch(int[] a,
int fromIndex,
int toIndex,
int key)
使用二分搜索法来搜索指定的 int 型数组的范围,以获得指定的值。必须在进行此调用之前对范围进行排序(通过 sort(int[], int,
int) 方法)。如果没有对范围进行排序,则结果是不确定的。如果范围包含多个带有指定值的元素,则无法保证找到的是哪一个。
参数:
a - 要搜索的数组
fromIndex - 要搜索的第一个元素的索引(包括)
toIndex - 要搜索的最后一个元素的索引(不包括)
key - 要搜索的值
返回:
如果它包含在数组的指定范围内,则返回搜索键的索引;否则返回 (-(插入点) - 1)。插入点
被定义为将键插入数组的那一点:即范围中第一个大于此键的元素索引,如果范围中的所有元素都小于指定的键,则为
toIndex。注意,这保证了当且仅当此键被找到时,返回的值将 >= 0。
抛出:
IllegalArgumentException
如果 fromIndex > toIndex
ArrayIndexOutOfBoundsException
如果 fromIndex < 0 或 toIndex > a.length
方法过程
package MidLocaltTest;
import java.util.Arrays;
//二分查找:元素必须是有序的
public class LocaltTest {
public static void main(String[] args) {
int[] arr = {20, 20, 6, 8, 9, 1, 2, 3, 4, 90, 100, 3, 0, -1, -2, 6, 9};
Arrays.sort(arr);//排序数组
System.out.println(Arrays.toString(arr));//[-2, -1, 0, 1, 2, 3, 3, 4, 6, 6, 8, 9, 9, 20, 20, 90, 100]
int index = LocaltTest.binarySearch(arr,0,arr.length ,4);
System.out.println(index);
}
//定义一个查找方法
private static int binarySearch(int[] arr,int fromIndex, int toIndex,int key){
int low=fromIndex;
int length=toIndex - 1;
while(low<=length){
int midIndex=(low+length) >>> 1;//取出数组的中间索引;
int mid=arr[midIndex];//取出中间值
if(mid>key){//中间值大于传入的值
length=midIndex-1;
}
else if(mid<key){
low=midIndex +1;
}else{
return midIndex;//返回会中间值
}
}
return -(low-1);//找不到就返回比key大的元素索引-1;
}
}