二分查找-递归(java)

简介: 二分查找-递归(java)

前置条件:有序数组

 
 
 
import java.util.ArrayList;
 
 
public class BinarySearch {
    public static void main(String[] args) {
        int[] arr = {1, 8, 10, 89, 1000, 1234};
        int index = binarySearch(arr, 0, arr.length, -89);
        //-1
        System.out.println(index);
 
        int[] arr2 = {1, 8, 10, 89, 1000, 1000, 1000, 1234};
        ArrayList list = binarySearch2(arr2, 0, arr2.length, 1000);
        //[4, 5, 6]
        System.out.println(list);
    }
 
    /**
     * 二分查找算法
     *
     * @param arr     数组
     * @param left    左边索引
     * @param right   右边索引
     * @param findVal 要查找的值
     * @return 如果找到返回下标,如果没有找到,就返回-1
     */
    private static int binarySearch(int[] arr, int left, int right, int findVal) {
        if (right < left) {
            return -1;
        }
        int mid = (left + right) / 2;
        int midVal = arr[mid];
        if (midVal == findVal) {
            return mid;
        }
        if (midVal > findVal) {
            return binarySearch(arr, left, mid - 1, findVal);
        } else {
            return binarySearch(arr, mid + 1, right, findVal);
        }
    }
 
    /**
     * 二分查找算法
     *
     * @param arr     数组
     * @param left    左边索引
     * @param right   右边索引
     * @param findVal 要查找的值
     * @return 如果找到返回下标集合,如果没有找到,就返回-1
     */
    private static ArrayList<Integer> binarySearch2(int[] arr, int left, int right, int findVal) {
        if (right < left) {
            return new ArrayList<Integer>();
        }
        int mid = (left + right) / 2;
        int midVal = arr[mid];
        if (midVal == findVal) {
            ArrayList<Integer> arrayList = new ArrayList<Integer>();
 
            //    向左扫描
            int temp = mid - 1;
            while (true) {
                if (temp < 0 || arr[temp] != findVal) {
                    break;
                }
                arrayList.add(temp);
                temp--;
            }
            arrayList.add(mid);
            //    向左扫描
            temp = mid + 1;
            while (true) {
                if (temp > arr.length || arr[temp] != findVal) {
                    break;
                }
                arrayList.add(temp);
                temp++;
            }
            return arrayList;
        }
        if (midVal > findVal) {
            return binarySearch2(arr, left, mid - 1, findVal);
        } else {
            return binarySearch2(arr, mid + 1, right, findVal);
        }
    }
}
相关文章
|
1月前
|
Java
在 Java 中实现二分查找法
【10月更文挑战第9天】
25 1
|
2月前
|
Java
java基础(11)函数重载以及函数递归求和
Java支持函数重载,即在同一个类中可以声明多个同名方法,只要它们的参数类型和个数不同。函数重载与修饰符、返回值无关,但与参数的类型、个数、顺序有关。此外,文中还展示了如何使用递归方法`sum`来计算两个数之间的和,递归的终止条件是当第一个参数大于第二个参数时。
32 1
java基础(11)函数重载以及函数递归求和
|
1月前
|
算法 Java
java冒泡排序与二分查找(详解)
java冒泡排序与二分查找(详解)
33 4
|
4月前
|
算法 Java
java使用递归及迭代方式实现前序遍历 中序遍历 后序遍历 以及实现层序遍历
java使用递归及迭代方式实现前序遍历 中序遍历 后序遍历 以及实现层序遍历
83 7
|
4月前
|
算法 Java
Java 使用二分查找快速定位元素位置
Java 使用二分查找快速定位元素位置
23 0
|
5月前
|
Java
java实现斐波那契数列(递归、迭代、流)
java实现斐波那契数列(递归、迭代、流)
|
5月前
|
存储 Java
Java基础手册(标识符 关键字 字面值 变量 数据类型 字符编码 运算符 控制语句 方法及方法重载和递归 面向对象与面向过程)
Java基础手册(标识符 关键字 字面值 变量 数据类型 字符编码 运算符 控制语句 方法及方法重载和递归 面向对象与面向过程)
39 0
|
5月前
|
Java 大数据 程序员
老程序员分享:java递归
老程序员分享:java递归
27 0
|
5月前
|
Java
二分查找-非递归(java)
二分查找-非递归(java)