Day568.线性查找&二分查找 -数据结构和算法Java

Posted 阿昌喜欢吃黄桃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day568.线性查找&二分查找 -数据结构和算法Java相关的知识,希望对你有一定的参考价值。

线性查找

1、介绍

顾名思义,线性查找就是直接通过遍历,进行查找对应的数据

2、代码实现

package com.achang.search;

/**
 * @Author Achang
 * @Date 2022/3/25 21:08
 * 顺序查找
 **/
public class SeqSearch 
    public static void main(String[] args) 
        int[] arr = 1,9,11,-1,31,89;
        int index = sqeSearch(arr, 9);
        System.out.println(arr[index]);
    

    /**
     * 线性查找
     * @param arr 待查找数组
     * @param value 查找的值
     * @return 查找的值的数组下标
     */
    public static int sqeSearch(int[] arr,int value)
        for (int i = 0; i < arr.length; i++) 
            if (arr[i] == value)
                return i;
            
        
        return -1;
    



二分查找

1、介绍

如针对一个有序的数组,进行一次一次的切半查找方式

2、思路分析

3、代码实现

①递归方式

/**
 * @Author Achang
 * @Date 2022/3/25 21:26
 * 二分查找
 **/
public class BinarySearch 
    public static void main(String[] args) 
        int[] arr = 1,3,5,7,9;
        int i = binarySearch1(arr, 9, 0, arr.length);
        System.out.println(i);

    

    //递归方式
    public static int binarySearch1(int[] arr,int value,int left,int right)
        if (left>=right) return -1;
        int mid = (left + right) / 2;
        int midValue = arr[mid];

        if (value > midValue)
            return binarySearch1(arr,value,mid +1,right);
        else if (value < midValue)
            return binarySearch1(arr,value,left,mid - 1);
        else 
            return mid;
        
    


②找到对应查找数字出现在数组中的所有索引下标

package com.achang.search;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author Achang
 * @Date 2022/3/25 21:26
 * 二分查找
 **/
public class BinarySearch 
    public static void main(String[] args) 
        int[] arr = 1,3,5,7,9,9;
        List<Integer> integers = binarySearch2(arr, 9, 0, arr.length);
        System.out.println(integers);

    
    
    /**
     * 找到对应查找数字出现在数组中的所有索引下标
     */
    public static List<Integer> binarySearch2(int[] arr, int value, int left, int right)
        if (left>=right) return new ArrayList<>();
        int mid = (left + right) / 2;
        int midValue = arr[mid];

        if (value > midValue)
            return binarySearch2(arr,value,mid +1,right);
        else if (value < midValue)
            return binarySearch2(arr,value,left,mid - 1);
        else 
            ArrayList<Integer> resIndexList = new ArrayList<>();
            //向左扫描
            int temp = mid - 1;
            while (temp >= 0 && arr[temp] == value) 
                resIndexList.add(temp);
                temp -= 1;
            
            resIndexList.add(mid);

            //向右扫描
            temp = mid + 1;
            while (temp <= arr.length-1 && arr[temp] == value) 
                resIndexList.add(temp);
                temp += 1;
            

            return resIndexList;
        
    



以上是关于Day568.线性查找&二分查找 -数据结构和算法Java的主要内容,如果未能解决你的问题,请参考以下文章

Python 迭代器&生成器,装饰器,递归,算法基础:二分查找二维数组转换,正则表达式,作业:计算器开发

python 之day4

Python之路,Day4

二分查找会更快吗?Python中的二分查找与线性查找性能测试

线性结构--二分查找

PY算法90天挑战--Day8二分查找