查找算法

顺序(线性)查找

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

二分查找(有序数组)

 public static int binarySearch(int[] arr,int val){
        return binarySearch(arr,0,arr.length-1,val);
    }
    public static int binarySearch(int[] arr,int left,int right,int val){
       if(left>right||val<arr[0]||val>arr[arr.length-1])
            return -1;
        int mid=(left+right)/2;
        if(val>arr[mid])
            return binarySearch(arr,mid+1,right,val);
        else if(val<arr[mid])
            return binarySearch(arr,left,mid-1,val);
        else
            return mid;
    }

插值查找

 public static int insertValueSearch(int[] arr,int val){
        return insertValueSearch(arr,0,arr.length-1,val);
    }
    public static int insertValueSearch(int[] arr,int left,int right,int val){
        if(left>right||val<arr[0]||val>arr[arr.length-1])
            return -1;
        int mid=left+(val-arr[left])*(right-left)/(arr[right]-arr[left]);
        if(val>arr[mid])
            return insertValueSearch(arr,mid+1,right,val);
        else if(val<arr[mid])
            return insertValueSearch(arr,left,mid-1,val);
        else
            return mid;
    }

斐波那契查找(黄金分割法)*

public static int[] fib(){
        int[] f=new int[maxSize];
        f[0]=1;
        f[1]=1;
        for(int i=2;i<maxSize;i++)
            f[i]=f[i-1]+f[i-2];
        return f;
    }
 public static int fibonacciSearch(int[] arr,int val){
        int low=0;
        int high=arr.length-1;
        int k=0,mid=0;
        int[] f=fib();
        while(high>f[k]-1)
            k++;

        int temp[]= Arrays.copyOf(arr,f[k]);
        for(int i=high-1;i<temp.length;i++)
            temp[i]=arr[high];

        while(low<=high){
            mid=low+f[k-1]-1;
            if(val<temp[mid]){
                high=mid-1;
                k--;
            }
            else if(val>temp[mid]){
                low=mid+1;
                k-=2;
            }
            else
            {
                if(mid<=high)
                    return mid;
                else
                    return high;
            }
        }
        return -1;
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容