學習筆記-二分查找

二分查找:

二分查找的前提必須是一個有序的數組

這裏提供兩個代碼一個是查找一個值的一下標,另一個是查找一個值的一下標

 /**
     * 二分查找      注意:前提是該數組是有序的
     * @param arr 查找的數組
     * @param left 左邊索引
     * @param right 右邊索引
     * @param value 要查找的值
     * @return 要查找的下標
     */
    public static int binarySearch(int[] arr, int left, int right, int value) {
        if (left > right) {
            return -1;
        }
        //mid中值
        int mid = (left + right) / 2;
        int midValue = arr[mid];
        if (value > midValue){
            //向右遞歸
            return binarySearch(arr, mid + 1, right, value);
        }else if(value < midValue) {
            //向左遞歸
            return binarySearch(arr, left, mid -1, value);
        }else {
            return mid;
        }
    }

    /**
     * 二分查找      注意:前提是該數組是有序的
     * @param arr 查找的數組
     * @param left 左邊索引
     * @param right 右邊索引
     * @param value 要查找的值
     * @return 要查找的下標list
     */
    public static ArrayList lBinarySearch(int[] arr, int left, int right, int value) {
        if (left > right) {
            return new ArrayList<Integer>();
        }
         //mid中值
        int mid = (left + right) / 2;
        int midValue = arr[mid];
        if (value > midValue){
            //向右遞歸
            return lBinarySearch(arr, mid + 1, right, value);
        }else if(value < midValue) {
            //向左遞歸
            return lBinarySearch(arr, left, mid - 1, value);
        }else {
            ArrayList<Integer> al = new ArrayList<>();
            int temp = mid - 1;
            while (true){
                if (temp < 0 || arr[temp] != value) {
                    break;
                }
                al.add(temp);
                temp -= 1;
            }
            al.add(mid);
            temp = mid + 1;
            while (true){
                if (temp > arr.length - 1 || arr[temp] != value) {
                    break;
                }
                al.add(temp);
                temp += 1;
            }
            return al;
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章