2.查找算法复习

这篇博客介绍了几种不同的二分查找算法,包括顺序查找、基本的折半查找、折半查找的递归形式以及优化的折半查找——插值查找。特别地,重点讲解了斐波那契查找算法,它利用黄金比例0.618来提高查找效率,时间复杂度在最坏情况下为O(log2n)。博客提供了详细的代码实现,并通过斐波那契数列构造查找点,提升了查找效率。
摘要由CSDN通过智能技术生成
public class Search {

    // 顺序查找法
    public static int SeqSearch(int[] a,int key){
        for(int i=0;i<a.length;i++)
            if(a[i]==key) return  i;
        return -1;
    }
    //折半查找
    public  static  int BinarySearch1(int[] a,int key){
        int head=0,tail=a.length-1;
        int mid;
        while(head<=tail){
            mid=(head+tail)/2;
            if(a[mid]==key) return  mid;
            else if(a[mid]> key)  tail=mid-1;
            else  head=mid+1;
        }
        return -1;
    }
    // 折半查找  递归形式
    public  static  int BinarySearch2(int[] a,int key,int head,int tail) {
        int mid = (head + tail) / 2;
        if (a[mid] == key) return mid;
        if (a[mid] > key) return BinarySearch2(a, key, head, mid - 1);
        if (a[mid] < key) return BinarySearch2(a, key, mid + 1, tail);
        return -1;
    }

    //折半查找 优化版 也叫:插值查找
    public  static  int BinarySearch3(int[] a,int key){
        int head=0,tail=a.length-1;
        int mid;
        while(head<=tail){
            mid=head+(key-a[head])/(a[tail]-a[head])*(tail-head);
            if(a[mid]==key) return  mid;
            else if(a[mid]> key)  tail=mid-1;
            else  head=mid+1;
        }
        return -1;
    }

    /* 随着斐波那契数列的递增,前后两个数的比值会越来越接近0.618
    斐波那契查找  二分查找的一种提升算法,通过运用黄金比例的概念在数列中
     选择查找点进行查找,提高查找效率。同样地,斐波那契查找也属于一种有序查找算法*/
    public  static  int BinarySearch4(int[] a,int key){
        int head=0,tail=a.length-1;
        int mid;
        int[] f = new int[20];
        // 构造一个斐波那契数组 f
        Fibonacci(f);
        int k=0;
        while (key>f[k]-1){    //计算key在斐波那契数列的位置 (8,13) 中
            ++k;
        }
        int[] temp =new int[f[k]-1]; //定义了 12长的数组
        System.arraycopy(a,0,temp,0,a.length);  //构建temp数组 ,是防止使用a数组中 mid大于a.length 导致报错 
        for (int i=a.length;i<f[k]-1;i++)   
            temp[i]=a[a.length-1];  

        while(head<=tail){
            mid=head+f[k-1]-1;
            if(key<temp[mid])
            {
                tail=mid-1;
                k-=1;
            }
            else if(key>temp[mid])
            {
                head=mid+1;
                k-=2;
            }
            else
            {
                if(mid<key)
                    return mid; //若相等则说明mid即为查找到的位置
                else
                    return key-1; //若mid>=n则说明是扩展的数值,返回n-1
            }
        }
        return -1;
    }
    //  构造一个斐波那契数组
    public static void Fibonacci(int[] f){
        f[0]=0;
        f[1]=1;
        for (int i=2;i<20;i++){
            f[i]=f[i-1]+f[i-2];
        }
    }



    public static void main(String[] args) {
          int[] a ={1,3,5,7,9,11,13,15};
        System.out.println(SeqSearch(a,9));
        System.out.println(BinarySearch1(a,9));
        System.out.println(BinarySearch2(a,9,0,a.length-1));
        System.out.println(BinarySearch3(a,9));
        System.out.println(BinarySearch4(a,9));
    }



}

斐波那契查找算法 总结: 

基本思想:二分查找的一种优化算法,基本的二分查找:通过折半,差值查找,是通过 key 与最小值和最大值进行比例性质 区分查询,而斐波那契查找 是通过 黄金比例 0.618分割,而恰巧随着斐波那契数列的递增,前后两个数的比值会越来越接近0.618,所以利用了斐波那契数组, 斐波那契查找属于一种有序查找算法。

复杂度分析:最坏情况下,时间复杂度为O(log2n),且其期望复杂度也为O(log2n)

代码中 构建 f 数组 就是为创造 0.618这个比例环境

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值