1. 首先编辑一组数据, 和待查找的数据
注: 二分查找最好是先排序, 这里是升序排序
数组中有可能有多个相同数据, 所以创建一个集合用来存放已经找到的索引
将参数传进方法内, 接下来实现方法:
public static void main(String[] args) {
int[] arr = {1,2,3,3,3,6,8};
Arrays.sort(arr);
System.out.println("首先排序: " + Arrays.toString(arr));
Scanner input = new Scanner(System.in);
System.out.println("请输入要查找的数: ");
int a = input.nextInt();
List<Integer> list = new ArrayList<>();
List<Integer> list1 = binarySearch(arr,a,0,arr.length-1, list);
//返回的集合为null或者集合长度为0就说明没有找到
if (list1 != null && list1.size() != 0){
System.out.println("索引值: " + list1);
}else {
System.out.println("没有这个数");
}
}
2. binarySearch方法的实现
当找到中间索引为要查找的值得时候, 要去分别判断他的下一个索引和上一个索引是不是等于要查找的值, 直到不等于就结束查 找, 然后将集合返回即可, 这里用到了递归
注: 写递归一定要知道出口在
如果中间索引不等于要查找的值, 就判断与要查找的值得相对大小, 将开始索引或者结束索引进行移动, 然后循环操作, 循环结束后如果还没有找到就返回一个空的集合
private static List<Integer> binarySearch(int[] arr,
int a,int beginIndex,int endIndex,List<Integer> list) {
int middleIndex = (beginIndex + endIndex) / 2;
while (beginIndex < endIndex) {
if (arr[middleIndex] == a) {
list.add(middleIndex);
preIndex(arr, a, middleIndex, list);
nextIndex(arr, a, middleIndex, list);
return list;
}else if (arr[middleIndex] < a){
beginIndex = middleIndex + 1;
middleIndex = (beginIndex + endIndex) / 2;
}else {
endIndex = middleIndex - 1;
middleIndex = (beginIndex + endIndex) / 2;
}
}
return list;
}
private static void nextIndex(int[] arr, int a, int middleIndex, List<Integer> list) {
int nextIndex = middleIndex + 1;
if (nextIndex <= arr.length-1 && arr[nextIndex] == a){
list.add(nextIndex);
nextIndex(arr,a,nextIndex,list);
}
}
private static void preIndex(int[] arr,int a, int middleIndex, List<Integer> list) {
int preIndex = middleIndex - 1;
if (preIndex >= 0 && arr[preIndex] == a){
list.add(preIndex);
preIndex(arr,a,preIndex,list);
}
}