二分查找

37 阅读1分钟

二分查找

public class BinarySearch1 {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5, 7, 7, 7, 7, 7};
        int value=7;
        ArrayList<Integer> list = binarySearch(arr, value, 0, arr.length - 1);
        System.out.println(list);

    }

    public static ArrayList<Integer> binarySearch(int[] arr, int value, int left, int right) {
        if (left > right) {
            return new ArrayList<>();
        }//先考虑极端情况
        int mid = (left + right) / 2;
        //```在数组排布比较均匀的情况下,也可以采用插值算法来快速定位到目标值的附近
//        int max = arr[right];
//        int min = arr[0];
//        int mid = (right - left)*(key - min) / (max - min)  ;
    int midVal = arr[mid];
    ArrayList<Integer> list = new ArrayList<>();
    if (value == midVal) {
        int i = mid - 1;
        while (i>=0&&arr[i] == midVal) {
            list.add(i);
            i--;
        }
        list.add(mid);
        i=mid+1;
        while (i<arr.length&&arr[i] == midVal) {
            list.add(i);
            i++;
        }
        Collections.sort(list);
        return list;

    } else if (value < midVal) {
        return binarySearch(arr, value, left, mid - 1);//需要靠递归的调用来返回,不加return的话返回的是空list
    } else {
        return binarySearch(arr, value, mid + 1, right);
    }


}

}