二分查找-递归(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);
        }
    }
}
目录
相关文章
|
2天前
|
算法 Java 机器人
Java数据结构与算法:查找算法之二分查找
Java数据结构与算法:查找算法之二分查找
|
5天前
|
Java
蓝桥杯Java组暴力递归搜图
蓝桥杯Java组暴力递归搜图
13 4
|
3天前
|
Java
java实现斐波那契数列(递归、迭代、流)
java实现斐波那契数列(递归、迭代、流)
8 1
|
1天前
|
存储 Java
Java基础手册(标识符 关键字 字面值 变量 数据类型 字符编码 运算符 控制语句 方法及方法重载和递归 面向对象与面向过程)
Java基础手册(标识符 关键字 字面值 变量 数据类型 字符编码 运算符 控制语句 方法及方法重载和递归 面向对象与面向过程)
5 0
|
3天前
|
Java 大数据 程序员
老程序员分享:java递归
老程序员分享:java递归
|
4天前
|
Java
二分查找-非递归(java)
二分查找-非递归(java)
5 0
|
5天前
|
Java
java使用递归遍历文件目录
java使用递归遍历文件目录
8 0
|
8天前
|
Java
杭电acm2018 母牛的故事 Java解法 经典递归
杭电acm2018 母牛的故事 Java解法 经典递归
9 0
Java实现二分查找
描述: 给定一个排好序的数组arr和一个数字x,让你在数组中找到x的下标,如果没有就返回-1;
116 0
|
算法 Java
Java实现二分查找法
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
2101 0