栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java实现4种查找算法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java实现4种查找算法

1.直接查找(暴力匹配)
public class Violence {
    public static void main(String[] args) {
        int [] arr={2,3,4,5,6,1,12,23};
        int search = search(1, arr);
        System.out.println(search);
    }
    public static int search(int n,int[] arr){
        for (int i=0;i
            if(arr[i]==n){
                return i;
            }
        }
        return -1;
    }
}
2.二分法

二分法的mid=(left+right)/2,然后递归

递归方法

 
 public static int  searchIndex(int []arr,int left,int right,int SearchVal){
     int mid=(left+right)/2;
     int minVal=arr[mid];
     if(left>right){
         return -1;
     }
      if(SearchVal>minVal){
        return   searchIndex(arr,mid+1,right,SearchVal);
      }else if(SearchVal
       return    searchIndex(arr,left,mid-1,SearchVal);
      }else {
          return mid;
      }
 }

非递归

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

用二分查找递归的方式查找有重复的数字

public static ArrayList searchIndex2(int []arr, int left, int right, int SearchVal){
    int mid=(left+right)/2;
    int minVal=arr[mid];
    if(left>right){
        return new ArrayList<>();
    }
    if(SearchVal>minVal){
        return   searchIndex2(arr,mid+1,right,SearchVal);
    }else if(SearchVal
        return    searchIndex2(arr,left,mid-1,SearchVal);
    }else {
        //return mid;
        ArrayList list = new ArrayList<>();
        //temp想左扫描
        int temp = mid-1;
        while (true){
            if(temp<0 || arr[temp]!=SearchVal){
                break;
            }
            list.add(temp);
            temp--;
        }
        list.add(mid);
        int temps = mid+1;
        while (true){
            if(temps>right ||arr[temps]!=SearchVal){
                break;
            }
            list.add(temps);
            temps++;
        }
        return list;
    }
}
3.插值查找

思想:就是将二分法的mid=(left+right)/2,变成mid=left+(right-left)*()(key-arr[left])/(arr[right]-arr[left]))然后递归

public static int InsertSearch(int []arr,int left,int right,int findVal){
    if(left>right || findValarr[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 InsertSearch(arr,mid+1,right,findVal);
    }else if(findVal
      return   InsertSearch(arr,left,mid-1,findVal);
    }else {
        return mid;
    }
}
4.斐波那契数列查找(黄金分割率)
//斐波那契查找算法
public class Fibonacci {
    public static int Maxsize = 20;

    public static void main(String[] args) {
        int[] arr = {1, 3, 5, 7, 9, 12, 15};
        int val = findVal(arr, 12);
        System.out.println(val);

    }

    //用函数定义一个斐波那契数列
    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 findVal(int[] arr, int key) {
        int low = 0;
        int high = arr.length - 1;
        int f[] = fib();// 调用的斐波那契数列
        int k = 0;//斐波那契数列所以
        int mid = 0;
        while (high > f[k]) {
            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 (key < temp[mid]) {
                high = mid - 1;
                k--;
            } else if (key > temp[mid]) {
                low = mid + 1;
                k -=2;
            } else {
                if(mid<=high){
                    return mid;
                }else {
                    return high;
                }
            }
        }
        return -1;
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/858832.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号