欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

[算法基础]线性、二分查找

最编程 2024-07-07 09:27:36
...

问题: 现有数组int[] arr = new int[]{1,3,5,63,2,55,78},找出值为2的元素,并返回其下标。

1. 线性查找(顺序查找)

  1. 声明两个变量:查找的元素、保存索引的变量
  2. 用for循环依次遍历

注意: 这里只查找一个元素,索引可以用于判断是否找到该元素。

    public static void main(String[] args) {

        int[] arr = new int[]{1,3,5,63,2,55,78};

        int value = 2;
        int index = -1;

        for (int i = 0; i < arr.length - 1; i++) {

            // 当找到元素后,拿到索引,结束循环。这里只查找一个。
            if ( arr[i] == value) {
                index =i;
                break;
            }
        }

        if ( index == -1 ){
            System.out.println("元素不存在!");
        }
        System.out.println("元素找到了,索引为:" + index);
        //输出:4
    }

2. 二分法查找

二分法查找的前提:数组是有序的

思路

  1. 将数组从中间分割为两部分(二分法),
  2. 用要查找的元素和数组中间的元素进行比较
  3. 若查找元素大于数组中间元素,则在数组右边查找;反之则在数组左边查找
  4. 再将查找的部分按前面的思路进行二分法查找,直到找到元素。
在这里插入图片描述
在这里插入图片描述

实现步骤

  1. 声明一个引用保存要查找的值value
  2. 声明头部下标headIndex = 0、尾部下标endIndex = arr.length-1
  3. 声明一个阈值flag = flae,用于判断元素是否存在使用
  4. 判断:headIndex <= endIndex 是否相等。
  5. 若不相等headIndex < endIndex:计算中间元素下标:midIndex = (headIndex + endIndex)/2
  6. value=arr[midIndex]:首尾索引相等则是同一个元素,则找到元素设置flag = true
  7. value > arr[midIndex]:则元素在右边。修改左边界 headIndex = minIndex + 1,
  8. value < arr[midIndex]:则元素在左边。修改左边界 endIndex = minIndex - 1,
  9. 最后通过flag判断是否找到元素。
在这里插入图片描述
在这里插入图片描述

代码实现

public static void main(String[] args) {

        int[] arr = new int[]{-99,-54,-2,0,2,33,43,256,999};

        // 1.声明一个引用保存要查找的值value
        int value = 1;

        // 用于判断元素是否找到
        boolean flag = false;
        
        // 2.声明头部下标headIndex=0、尾部下标endIndex=arr.length-1
        int headIndex = 0, endIndex = arr.length - 1;

        // 3.判断:headIndex <= endIndex 是否相等,
        while ( headIndex <= endIndex ){ //注意结束条件

            int midIndex = (headIndex + endIndex)/2;

            // 首尾索引相等则是同一个元素,找到了该元素
            if ( value == arr[midIndex] ) {
                flag = true;
                System.out.println( "索引找到了:" + midIndex );
                break;

            }else if ( value > arr[midIndex] ) {// 则元素在右边,在右边查找
                
                headIndex = midIndex + 1;
                
            }else { // 否则value < arr[midIndex]元素在左边,在左边查找

                endIndex = midIndex - 1;

            }
        }

        // 若循环结束 flag = false 则没有找到元素
        if ( !flag ) {
            System.out.println( "元素不存在!" );
        }
    }

3. 线性查找和二分法查找对比

线性查找:

  • 优点:通用性更强
  • 缺点:效率低,时间复杂度为:O(N)

二分法查找:

  • 优点:效率高,时间复杂度为:O(logN)
  • 缺点:数组必须有序