• 查找算法 java


    package com.算法.查找;
    
    import static java.util.Arrays.sort;
    
    public class 二分查找 {
        //二分查找要求数组有序
        //代码分别找到数据的左边界和右边界
        public static boolean flag ;
        public static void main(String[] args) {
            int[] array = new int[]{-2,0,0,1,9,8,0,-1,3,0};
            sort(array);
            int zuo = bin01(0,array);
            int you = bin02(0,array);
            for(int i=0;i<array.length;i++){
                System.out.print(array[i]+" ");
            }
            System.out.println();
            if(flag){
                System.out.println(zuo+"  "+you); //输出左边界数据和右边界数据所在的位置
            }else{
                System.out.println("不存在此数据");
            }
    
        }
        public static int bin01(int data,int[] arr){ //找左边界
            int head = 0;
            int tail = arr.length;
            int mid  = (head+tail)/2;
            while(head<tail){
                if(arr[mid]==data){
                    flag = true;
                }
                if(arr[mid]>=data){
                    tail=mid;
                }else{
                    head=mid+1;
                }
                mid  = (head+tail)/2;
            }
            return tail ;
        }
        public static int bin02(int data,int[] arr){ //找右边界
            int head = 0;
            int tail = arr.length;
            int mid = (head+tail)/2;
            while(head<tail){
                if(arr[mid]==data){
                    flag = true;
                }
                if(arr[mid]<=data){
                    head=mid+1;
                }else{
                    tail=mid;
                }
                mid  = (head+tail)/2;
            }
            return head-1;
        }
    }
    
    
    package com.算法.查找;
    
    public class 插值查找 {
        public static void main(String[] args) {
            int[] array = new int[]{0,1,2,3,5,7,8,9,11};
            int ans = cha(array,0);
            System.out.println(ans);
        }
        public static int cha(int[] arr,int data){
            int head = 0;
            int tail = arr.length-1;
            int mid = (int) (head+(data-arr[head])*(tail-head)/(0.5+arr[tail]-arr[head]));
            while(head<=tail){
                if(arr[0]>data||arr[tail]<data) return -1;
                if(arr[mid]>data){
                    tail=mid-1;
                }else if(arr[mid]<data){
                    head=mid+1;
                }else{
                    return mid;
                }
                mid = (int) (head+(data-arr[head])*(tail-head)/(0.5+arr[tail]-arr[head]));
            }
            return head;
        }
    }
    
    
    package com.算法.查找;
    
    import java.util.Arrays;
    
    public class 斐波那契查找 {
        public static void main(String[] args){
            int[] arr = new int[]{1,2,5,8,9,123,567};
            System.out.println("下标为:"+ok(123,arr));
        }
        public static int[] fib(int size){ //获取指定元数数量的斐波那契数列
            int[] f = new int[size];
            f[0]=f[2]=1;
            for(int i=2;i<size;i++){
                f[i] = f[i-1]+f[i-2];
            }
            return f;
        }
        public static int ok(int value , int[] arr){ //查找数组中指定元素的位置
               int[] fib = fib(20);
               int head = 0;
               int tail = arr.length-1;
               int k = 0;
               int mid = 0;
               while(tail>fib[k]-1){
                   k++;
               }
               int[] temp = Arrays.copyOf(arr,k); //我们操作的临时数组
               int t =tail+1;
               while(temp.length>t){
                    temp[t++]=arr[tail];
               }
               while(head<=tail){
                  mid = head +fib[k-1]-1;
                  if(temp[mid]<value){
                      head = mid +1;
                      k-=2;
                  }else if(temp[mid]>value){
                      tail = mid-1;
                      k--;
                  }else{
                      if(mid<=tail){
                          return mid;
                      }else{
                          return tail;
                      }
                  }
               }
               return -1;
        }
    }
    
    
  • 相关阅读:
    一个数组中去除某一部分数组
    关于函数的同步异步
    多维数组转一维数组
    关于Promise的详细总结
    关于ES6(ES2015)的知识点详细总结
    vue实现一个会员卡的组件(可以动态传入图片(分出的一个组件)、背景、文字、卡号等)
    GitHub上常用命令(工作中几乎每天用到的命令)
    gitHub上如何设置或者取消电子邮箱提醒
    React评论展示案例(包含知识点:state、props、ref、React声明周期、localStorage本地存储等)
    感想2-对于组件化的一些思考
  • 原文地址:https://www.cnblogs.com/fxzemmm/p/14847940.html
Copyright © 2020-2023  润新知