二分查找应用于已排好序的数组,手写二分查找代码如下:
class ArrDemo{
public static void main(String[] args){
int[] arr1 = {1,4,13,17,21,33,46,76,99,};
System.out.println(halfSearch(arr1,21));
System.out.println(getIndex(arr1,13));
}
//折半查找法:应用的前提是数组已经排好序
public static int halfSearch(int[] arr, int key){
int min = 0;//记录数组起始下表
int max = arr.length-1;//记录数组最后下标
int mid = (min+max)/2;//计算中间下标
while(key != arr[mid])
{//如果中间那个值不是要找到结果
if(key > arr[mid])
{//key大于中间值
min = mid + 1;
}
if(key < arr[mid])
{
max = mid - 1;
}
if(min > max)
{
return -1;
}
//重新计算中间下标
mid = (min + max)/2;
}
return mid;
}
//一般查找:
public static int getIndex(int[] arr,int key){
for(int i=0;i<arr.length;i++){
if(key == arr[i])
{
return i;
}
}
return -1;
}
}
在java_API的Arrays类中,其实也定义了这一方法: import java.util.Arrays;//Arrays包
class BinarySearch{
public static void main(String[] args){
int[] arr1 = {1,2,3,4,5,6,7,8,10,11,12,};//11个元素
//【整体搜索(两参)】
System.out.println(Arrays.binarySearch(arr1,8));//索引为7
//【局部搜索(四参)】
System.out.println(Arrays.binarySearch(arr1,2,6,5));
//需要注意的是当有四个参数时,搜索范围是[ )
//如果找不到返回(-(插入点)-1)
//插入点被定义为:第一个大于此键的元素索引
//【两参找不到的返回】
System.out.println(Arrays.binarySearch(arr1,9));//(-(8)-1)=-9
//如果数组中的所有元素都小于指定的键,则为 a.length。
System.out.println(Arrays.binarySearch(arr1,15));//-12 (-(11)-1)=-12
//【四参找不到的返回】
System.out.println(Arrays.binarySearch(arr1,2,6,7)); //(-(-6)-1)=-7
//如果范围中的所有元素都小于指定的键,则为 toIndex。
System.out.println(Arrays.binarySearch(arr1,2,6,16)); //(-(-6)-1)=-7
}
}
binarrySearch的用法:
(1)导包:
import java.util.Arrays;
(2)调用:
Arrays.binarySearch(int[] a , int key)
Arrays.binarySearch(int[] a,int fromIndex,int toIndex,int key)
参数:
- a - 要搜索的数组
- fromIndex - 要搜索的第一个元素的索引(包括)
- toIndex - 要搜索的最后一个元素的索引(不包括)
- key - 要搜索的值
(3)返回:
找到就返回key的索引(下标),找不到就返回(-(插入点)-1);
插入点被定义为第一个大于此键的元素索引,如果范围中的所有元素都小于指定的键,则为a.length(双参中),或toIndex(四参中)