常见算法(查找算法)(重点查找法)

184 阅读2分钟

基本查找

核心思路: 从0索引开始挨个往后查找,所以需要一个容器,像是数组或者是集合,这类可以去遍历的容器

二分查找

前提条件:数组中的数据必须是有序的,核心逻辑:每次排除一半的查找范围

1.基本查找

实例

public static void main(String[] args) {
        //基本查找/顺序查找
        //核心思路
        //从0索引开始挨个往后查找

        //需求:定义一个方法利用基本查找,查询某个元素是否存在
        //数据如下:{123,123,535,56,334,7,56,87,79}

        int arr1[] = {123,123,535,56,334,7,56,87,79};
        int num = 56;

        System.out.println( jbcz(arr1,num));


    }
    public static boolean jbcz(int arr[],int num){
        for (int i = 0; i < arr.length; i++) {
            if(arr[i] == num){
                return true;
            }
        }
        return false;
    }
}

2.二分查找/折半查找

前提条件:数组中的数据必须是有序的,如果数据是乱斗,先排序再用二分查找得到的索引就没有实际意义了,只能确定当前数字在数组中是否存在,因为排序之后数字的位置可能就发生变化了。

查找过程:首先,我们必须规定一个最小值,和一个最大值,而且要求出中间值,然后每次查找后,然后要查找的元素在中间值的左边,最大值要发生改变,让最大值的值变成中间值-1,缩小范围。如果要查找的元素在中间值的右边,最小值要发生改变,让最小值的值变成中间值+1,缩小范围

二分查找:可以提高查找的效率,每次可以去掉一半的范围,高效。

public static void main(String[] args) {

        //前提条件:数组中的数据必须是有序的
        //核心逻辑:每次排除一半的查找范围

        int arr[] = {1,2,3,4,5,6,7,8,9,10};
        int num = 3;
        System.out.println(efcz(arr,num));
    }

    public static int efcz(int arr[],int num){
        //定义两个变量记录要查找的范围
        int min = 0;
        int max = arr.length - 1;

        //2.利用循环不断的去找要查找的数据
        while(true){
            if(min>max){
                return -1;
            }
            
            //3.找到min 和 max的中间位置
            int mid = (min + max)/2;

            //4.然后我们拿着mid指向的元素跟我们要查找的元素进行对比
            if(arr[mid]>num){
                max = mid - 1;
            }else if (arr[mid]<num){
                min = mid + 1;
            }else{
                return num;
            }

        }

    }
}