04斐波那契查找

96 阅读1分钟

04斐波那契查找

基本思想:利用斐波那契数列去将原始数组分割比较,最后确定查找值key的位置。
讲解:
    //创建一个名为Interpolation_search的方法,传入数组a及其大小以及查找值key
    public static int Interpolation_search(int a[],int n,int key){
        //定义斐波那契数列前两位数字:0、1
        int f1 = 0,f2 = 1;
        //定义第三位数字,斐波那契数列的规律是,当前位置数值由前两位之和
        int f = f1 + f2;
        //循环找出斐波那契数中第一个大于原数组a数组长度的数
        while(f < n){
            //f1和f2的值全部向后移位
            f1 = f2;
            f2 = f;
            //让现在的f1和f2的和赋予f
            f = f1 + f2;
        }
        //设置淘汰范围
        int offset = -1;
        //循环条件:斐波那契数始终大于1
        while(f > 1){
            //变量i保存offset + f1 和n - 1中的最小值
            int i = Math.min(offset + f1,n - 1);
            //判断当前下标i对应的值是否小于查找值key
            if(a[i] < key){
                //如果是则,f、f2整体向后移
                f = f2;
                f2 = f1;
                //而f1的值变为f - f2
                f1 = f - f2;
                //让offset的值为此时的i
                offset = i;
            //若是大于
            }else if(a[i] > key){
                //f、f2的值整体向后移2位
                f = f1;
                f2 = f2 - f1;
                //而f1的值变为f - f2
                f1 = f - f2;
            //若是等于
            }else{
                //直接返回此时的下标i
                return i;
            }
        }
        //若f2存在且最后的元素为key
        if(f2 != 0 && a[offset + 1] == key){
            //则直接返回offset + 1
            return offset + 1;
        }
        //当所有任务等进行完毕仍未结束,直接返回-1,表示该数组中并无查找值
        return -1;
    }