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

斐波那契查找  

斐波那契数列(F[k]): 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89…… n 等于数组的长度    k为斐波那契数列中刚好大于n的数所在数组的下标.

class Program
    {

        static int count = 20;
        static int[] test = { 1, 5, 15, 22, 25, 31, 39, 42, 47, 49, 59, 68, 88 };
        static int[] fibo = new int[20];

        //生成斐波那契数组
        static void Fibonacci(int[] vs,int num)
        {
            vs[0] = 1;
            vs[1] = 1;

            for (int i = 2; i < num; i++)
            {
                vs[i] = vs[i - 2] + vs[i - 1];
            }
        }

        //使用斐波那契数组,切割查找对象所在的数组后,找到它
        static int FindIndex(int[] source,int key)
        {
            int k = 0;
            int mid = (int)(source.Length*0.618f);
            int max = source.Length;
            int min = 0;
            while(max > fibo[k] - 1)
            {
                ++k;
            }

            while (min <= max)
            {
                
                if (source[mid] > key)
                {
                    max = mid - 1;
                    if(fibo[k - 1] - 1 > min)
                    { 
                    k = k - 1;
                    mid = fibo[k - 1];
                    }
                    else
                    {
                        --mid;
                    }
                }
                else if (source[mid] < key)
                {
                    min = mid + 1;
                    if (fibo[k + 1] < max)
                    { 
                        k = k + 1;
                        mid = fibo[k + 1];
                        
                    }
                    else
                    {
                        ++mid;
                    }

                }
                else
                {
                    if (mid<=max)
                    {
                        return mid;
                    }
                    else
                    {
                        return max;
                    }
                }
            }

            return -1;

        }

        static void Main(string[] args)
        {

            Fibonacci(fibo, count);

            int index;

            index = FindIndex(test, 25);  //要查找的对象.

            if (index != -1)
            {
                Console.WriteLine("Index==" + index);
            }

        }
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值