查找算法之二分查找法

package dataStruct.查找算法;

import java.util.ArrayList;
import java.util.Arrays;

public class 二分查找法 {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4,4, 5, 6, 23, 43, 234};
        ArrayList<Integer> list = binarySearch1(arr, 0, arr.length - 1, 4);
        System.out.println(Arrays.toString(list.toArray()));
    }

    /**
     * //二分查找法,如果要查找的值比中值小左递归,比他大,有递归,相等返回下标,不相等返回-1
     *
     * @param arr       在arr中查找需要查找的数字
     * @param left      数组的左端点
     * @param right     数组的右端点
     * @param findValue 需要查找的值
     */
    //以下方法,将所有重复的数的下标打印
    public static int binarySearch(int[] arr, int left, int right, int findValue) {
        if (left > right) {
            return -1;
        }
        int mid = left + (right - left) / 2;
        //二分递归的出口,left>right
        if (findValue > arr[mid]) {//要查找的数比中值大,又递归
            return binarySearch(arr, mid + 1, right, findValue);
        } else if (findValue < arr[mid]) {
            return binarySearch(arr, left, mid - 1, findValue);
        } else {
            return mid;
        }
    }
    //以下方法可以将重复数的全部下标返回,返回多个下标
    /*
    思路:
        1.将方法返回值设置成一个集合ArrayList
        2.将找到mid以后,遍历mid左边的数,并将下标返回添加到数组中
        3.向右遍历
        4.最终返回集合
     */
    public static ArrayList<Integer> binarySearch1(int[] arr, int left, int right, int findValue) {
        if (left > right) {
            return new ArrayList<Integer>();
        }
        int mid = left + (right - left) / 2;
        //二分递归的出口,left>right
        if (findValue > arr[mid]) {//要查找的数比中值大,又递归
            return binarySearch1(arr, mid + 1, right, findValue);
        } else if (findValue < arr[mid]) {
            return binarySearch1(arr, left, mid - 1, findValue);
        } else {
            ArrayList<Integer> list = new ArrayList<>();
            int temp = mid;
            while(true){
                if (arr[temp] == findValue && temp > 0){
                    list.add(temp);
                    temp--;
                }else {
                    break;
                }
            }
            temp = mid +1;
            while(true){
                if (arr[temp] == findValue && temp < arr.length){
                    list.add(temp);
                    temp++;
                }else {
                    break;
                }
            }
            return list;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_52655865/article/details/122068897