ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

数据结构与算法---11.查找(线性查找、二分查找、插值查找)

2021-07-29 16:02:47  阅读:159  来源: 互联网

标签:11 arr right int findVal mid --- 查找 left


11ss

1.线性查找 

代码实现

public class SeqSearch {
    public static void main(String[] args) {
        int arr[]={1,9,11,-1,34,89};//没有顺序的数组

        int index = seqSearch(arr, 11);

        if (index==-1){
            System.out.println("没有找到");
        }else {
            System.out.println("找到了,下标为" + index);
        }
    }

    public static int seqSearch(int[] arr,int value){
        for (int i = 0; i < arr.length; i++) {
            if (value==arr[i]){
                return i;
            }
        }
        return -1;
    }
}

2.二分查找

请对一个有序数组进行二分查找 {1,8, 10, 89, 1000, 1234} ,输入一个数看看该数组是否存在此数,并且求出下标,如果没有就提示"没有这个数"。

 代码实现:

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

//注意:使用二分查找的前提是该数组是有序的
public class BinarySearch {
    public static void main(String[] args) {
        int[] arr={1,8,10,89,1000,1000,1000,1000,1234};

//        int index = binarySearch(arr, 0, arr.length - 1, 9);
//        System.out.println(index);
        List<Integer> indexList = binarySearch2(arr, 0, arr.length - 1, 1000);
        System.out.println(indexList);
    }

    //二分查找

    /**
     *
     * @param arr 数组
     * @param left 左边的索引
     * @param right 右边的索引
     * @param findVal 要查找的值
     * @return 如果找到就返回下标,如果没有找到,就返回-1
     */
    public static int binarySearch(int[] arr,int left,int right,int findVal){

        //说明递归完整个数组,但没有找到
        if (left>right){
            return -1;
        }

        int mid=(left+right)/2;
        int midVal=arr[mid];

        if (findVal>midVal){//向右递归
            return binarySearch(arr,mid+1,right,findVal);
        }else if (findVal<midVal){//向左递归
            return binarySearch(arr,left,mid-1,findVal);
        }else {
            return mid;
        }
    }

    /*
    有多个相同的数值时,如何将所有的数值都查找到,比如这里的1000
    思路分析
    1.在找到mid索引值,不要马上返回
    2.向mid索引值的左边扫描,将所有满足1000,的元素的下标,加入到集合ArrayList
    3.向mid索引值的右边扫描,将所有满足1000,的元素的下标,加入到集合ArrayList
    4.将Arraylist返回
     */
    public static List<Integer> binarySearch2(int arr[],int left,int right,int findVal){

        //说明递归完整个数组,但没有找到
        if (left>right){
            return new ArrayList<>();
        }

        int mid=(left+right)/2;
        int midVal=arr[mid];

        if (findVal>midVal){//向右递归
            return binarySearch2(arr,mid+1,right,findVal);
        }else if (findVal<midVal){//向左递归
            return binarySearch2(arr,left,mid-1,findVal);
        }else {

            List<Integer> list=new ArrayList<>();
            int temp=mid-1;

            while (temp>=0&&arr[temp]==findVal){
                list.add(temp);
                temp--;
            }
            list.add(mid);

            temp=mid+1;

            while (temp<=arr.length&&arr[temp]==findVal){
                list.add(temp);
                temp++;
            }
            return list;
        }
    }
}

3.插值查找

 

 

插值查找注意事项:

1)对于数据量较大,关键字分布比较均匀的查找表来说,采用插值查找,速度较快.

2)关键字分布不均匀的情况下,该方法不一定比折半查找要好

代码实现

public class InsertValueSearch {
    public static void main(String[] args) {

        int[] arr=new int[100];
        for (int i = 0; i < 100; i++) {
            arr[i]=i+1;
        }

        int index = insertValueSearch(arr, 0, arr.length - 1, 100);
        System.out.println(index);
    }

    //递归
    public static int insertValueSearch(int[] arr,int left,int right,int findVal){

        //注意:findVal<arr[0]和findVal>arr[arr.length-1]必须需要
        if (left>right||findVal<arr[0]||findVal>arr[arr.length-1]){
            return -1;
        }

        int mid=left+(right-left)*(findVal-arr[left])/(arr[right]-arr[left]);
        int midVal=arr[mid];

        if (findVal>midVal){//向右递归
            return insertValueSearch(arr,mid+1,right,findVal);
        }else if (findVal<midVal){//向左递归
            return insertValueSearch(arr,left,mid-1,findVal);
        }else {
            return mid;
        }
    }
}

标签:11,arr,right,int,findVal,mid,---,查找,left
来源: https://blog.csdn.net/weixin_46133743/article/details/119212738

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有