java数据结构 基本查找,二分查找,分块查找

算法查找

基本查找

又叫顺序查找 从0索引开始挨个往后查找
需求 定义一个方法利用基本查找 查找某个元素是否存在
{132,135,65,86,89,6}

  public static void main(String[] args) {

        int arr[]={132,135,65,86,89,6};
        int searchNumber=65;
        boolean b = basicSearch(arr, searchNumber);
        System.out.println(b);


    }

    private static boolean basicSearch(int arr[], int searchNumber) {

        for (int i = 0; i < arr.length; i++) {
            if(arr[i]==searchNumber){
                return true;
            }

        }
        return false;

    }

定义一个方法利用基本查找 查询某个元素在数组中的索引
烤炉数组中元素有重复的可能性
int arr[]={6,135,65,86,89,6} 我要查询6 返回索引为0和5

public static void main(String[] args) {
        //定义一个方法利用基本查找 查询某个元素在数组中的索引
        //烤炉数组中元素有重复的可能性
        //int arr[]={6,135,65,86,89,6} 我要查询6  返回索引为0和5

        int arr[]={6,135,65,86,89,6};
        int searchNumber=6;
        ArrayList<Integer> integers = basicSearch(arr, searchNumber);

        for (int i = 0; i < integers.size(); i++) {
            Integer integer = integers.get(i);
            System.out.println(integer);
        }


    }

    private static ArrayList<Integer> basicSearch(int arr[], int searchNumber) {

        ArrayList<Integer>list=new ArrayList<>();
        for (int i = 0; i < arr.length; i++) {
            if(arr[i]==searchNumber){
                list.add(i);
            }

        }
        return list;

二分查找

二分查找1的数组中数据必须是有序的
核心思想:每次排除一半的查找范围

在这里插入图片描述

    public static void main(String[] args) {

        int arr[]={4,23,67,14,126,33};
        int number=67;
        int i = binarySearch(arr, number);
        System.out.println(i);


    }

    public static int binarySearch(int arr[], int number) {
        
        //定义两个变量记录要查找到范围
        int min=0;
        int max=arr.length-1;
        //2利用循环不断求要找到的数据
        while (true){
            if(min>max){//如果遇到这个条件相当于循环完了
                return -1;
            }

            //找到 mid位置
            int mid=(min+max)/2;

            //拿着mid指向元素跟查找的元素比较
            if(arr[mid]>number){
                //number在mid左边  min不变 max等于mid-1
                max=mid-1;

            }else if(arr[mid]<number) {
                //number在mid又边  max不变 min等于mid+1)
                min = mid + 1;

            }else{
                //number和mid指向元素一样 找到了
                return mid;
            }


        }

    }

优化方式 插值查找了解即可

在这里插入图片描述

斐波那契查找 了解

在这里插入图片描述

以上总结

在这里插入图片描述

分块查找

在这里插入图片描述

把获得到的数据分成若干个小块
第一块是最小 第一块中最大数据值不会大于第二块所有数据,第二快中最大数据不会大于第三块所有数据…

在这里插入图片描述

思路:分成四块每块定义成一个类 类的内容记录了 该块的最大值起始索引和结束索引,然后把这四块对象存在数组内进行调用.如下图
在这里插入图片描述

  public static void main(String[] args) {

        int arr[]={16,5,9,12,21,18,
                32,23,37,26,45,34,
                50,48,61,52,73,66};
        //分成了三块.分块思路总数开根号 这个是16个  开根号等于4.5左右


        //定义一个类存储三个组
        Block b1=new Block(21,0,5);
        Block b2=new Block(45,6,11);
        Block b3=new Block(73,12,17);

        //定义一个数组存储管理上面三个组(索引表)

        Block[]blockarr={b1,b2,b3};

        int number=37;
        //要查询的数

        //调用方法传递索引表 要查询的数据 arr数组
        int index = getIndex(blockarr, arr, number);
        System.out.println(index);


    }

    private static int getIndex(Block[] blockarr, int[] arr, int number) {
        //在这之前要知道要查询的数number在哪个组里
        //定义一个方法
        int numberIndex = getNumberIndex(blockarr, number);
        //numberIndex就是找到的符合的组块索引
        //获取这块索引得最大值 起始索引和结束
        int endIndex = blockarr[numberIndex].getEndIndex();
        int maxIndex = blockarr[numberIndex].getMaxIndex();
        int startIndex = blockarr[numberIndex].getStartIndex();

        //遍历该组
        for (int i = startIndex; i < endIndex; i++) {
            if(arr[i]==number){
                return i;
            }

        }
        return -1;


    }

    private static int getNumberIndex(Block[] blockarr, int number) {

        for (int i = 0; i < blockarr.length; i++) {
            //思路 获取每个组中最大数  找到比要查询的数小的哪个就是



            if(blockarr[i].getMaxIndex()>number){
                return i;
            }



        }



        return -1;//找不到直接返会-1结束代码

    }
}
class Block{
    private int maxIndex;
    private int startIndex;
    private int endIndex;


    public Block() {
    }

    public Block(int maxIndex, int startIndex, int endIndex) {
        this.maxIndex = maxIndex;
        this.startIndex = startIndex;
        this.endIndex = endIndex;
    }

    /**
     * 获取
     * @return maxIndex
     */
    public int getMaxIndex() {
        return maxIndex;
    }

    /**
     * 设置
     * @param maxIndex
     */
    public void setMaxIndex(int maxIndex) {
        this.maxIndex = maxIndex;
    }

    /**
     * 获取
     * @return startIndex
     */
    public int getStartIndex() {
        return startIndex;
    }

    /**
     * 设置
     * @param startIndex
     */
    public void setStartIndex(int startIndex) {
        this.startIndex = startIndex;
    }

    /**
     * 获取
     * @return endIndex
     */
    public int getEndIndex() {
        return endIndex;
    }

    /**
     * 设置
     * @param endIndex
     */
    public void setEndIndex(int endIndex) {
        this.endIndex = endIndex;
    }

    public String toString() {
        return "Block{maxIndex = " + maxIndex + ", startIndex = " + startIndex + ", endIndex = " + endIndex + "}";
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值