查询算法——顺序查找(优化),二分查找(递归)

发布时间 2023-11-01 21:48:57作者: 奕帆卷卷

顺序查找
顺序查找又称为线性查找,是一种最简单的查找方法。适用于线性表的顺序存储结构和链式存储结构,从第一个元素开始逐个与需要查找的元素x进行比较,当比较到元素值相同时,返回元素m的下标,如果比较到最后都没有找到,则返回-1;
时间复杂度为O(n)

点击查看代码
public static void main(String[] args) {
        int[] array = {12, 3, 43, 5, 9};
        int target = 43;
        int[] newArray = new int[array.length + 1];
        newArray[0] = target;
        for (int i = 0; i < array.length; i++) {
            newArray[i + 1] = array[i];
        }


    }

    //顺序查找 封装方法
    /*private static int sequenceSearch(int[] array, int target) {
        for (int i = 0; i < array.length; i++) {
            if (target == array[i]) {
                return i;
            }
        }
        return -1;
    }*/

优化
面对大量数据时,常常要使用预处理或者清洗操作
将要查询的数据放到新数组的第一个,然后将要查询的数组放入新数组进行查询

  

  //查询方法,从最后一位元素往前查询,一直到第一个
    public static int sequenceSearchPlus(int[] arr, int key) {
        int n = arr.length - 1;
        arr[0] = key;
        while (arr[n] != key) {
            n--;
        }
        return n;
    }

}

二分查找
/*
* 在有序数组中查找某一特定元素的查找算法
*用给定k值先于中间节点的关键字比较,中间节点把线性表分为两个子表,若相等
* 则查找成功;若不相等,再根据k与该中间节点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点
* 折半搜索每次将搜索区域减少一半,时间复杂度为O(logn)
* 空间复杂度O(1)
*
* 当查找表不会频繁更新,删除操作时,使用折半查找是比较理想的
* 如果查找表有频繁的更新,删除操作,维护表的有序会花费比较大的精力,不建议使用该查找方式
* */

点击查看代码
 static int binarySearch1(int arr[], int len, int target) {
        //初始化左右搜索边界
        int left = 0, right = len - 1;
        int mid;
        while (left <= right) {
            //中间位置:两边界元素之和/2 向下取整
            mid = (left + right) / 2;
            //arr[mid] 大于target,即要寻找的元素在左半边,所以需要设定右边界为mid-1,搜索左半边
            if (target < arr[mid]) {
                right = mid - 1;

                //arr[mid]小于target,即要寻找的元素在右半边,所以需要设定左边界为mid+1,搜索右半边
            } else if (target > arr[mid]) {
                left = mid + 1;
                //搜索到对应元素
            } else if (target == arr[mid]) {
                return mid;
            }
        }

        return -1;
    }

递归法

点击查看代码
static int binarySearch2(int array[], int left, int right, int target) {
        if (left <= right) {
            int mid = (left + right) / 2;
            if (array[mid] == target) {
                return mid;
            } else if (array[mid] < target) {
                return binarySearch2(array, mid + 1, right, target);
            } else {
                return binarySearch2(array, left, mid - 1, target);
            }
        } else {
            return -1;
        }
    }