1.前提条件数组必须有序
如果数组本身无序,让我们查询元素,先排序再去查找
(有条件需求,先排序,再查;如果没有条件需求,只能使用基本元素查找法:从头查找到尾)
思想:
数组折半查,使用数组中的中位点((最小角标+最大角标)/2)作为比较对象
如果当前查找的元素和中位点的元素进行比较,如果小于中位点,缩小查询
区域,在左半区域去找,继续计算中位点(索引值)
如果当前查找的元素和中位点的元素进行比较,如果大于中位点,缩小查询
区域,在右半区域去找,继续计算中位点(索引值)
如果相等,直接返回中位点元素对应 索引值
优点:查询次数少,每次都是对数组进行折半.
缺点:插入元素和删除元素困难,比较麻烦.
public class BinarySearch {
public static void main(String[] args) {
//已知数组,静态初始化
int[] arr = {11,22,33,44,55} ;
//调用二分搜索方法查询
int index = binarySearch(arr, 22);
System.out.println(index);
int index2 = binarySearch(arr,66) ;
System.out.println(index2);
int index3 = binarySearch(arr,44) ;
System.out.println(index3);
}
//返回值int
//方法参数:数组,查询的元素
public static int binarySearch(int[] arr,int target){
//防止空指针异常
if(arr!=null){
//定义数组的最小索引:
int min = 0 ;
//定义最大索引
int max = arr.length -1 ;
//使用循环while
while(min<=max){
//计算中位点索引
int mid = (min+max)/2 ;
//如果当前中位点对应的元素小于要要查找的元素
if(target < arr[mid]){
//左半区域:继续折半
max = mid -1 ;
}else if(target > arr[mid]){
//右边区域:继续折半
min = mid + 1 ;
}else{
//查询到了
return mid ;
}
}
}
//循环结束之后,还没有找,则返回-1
return -1 ;
}
}
2. Arrays工具类:
里面提供排序sort(任何数组进行排序) :元素升序排序 Integer,String
里面提供二分搜素法(任何类型进行查询 ,int key)
import java.util.Arrays;
public class BinarySearch {
public static void main(String[] args) {
//已知数组,静态初始化
int[] arr = {11, 22, 33, 44, 55};
int index4 = Arrays.binarySearch(arr, 55);
System.out.println(index4);
int index5 = Arrays.binarySearch(arr, 66);
System.out.println(index5);
}
}