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

斐波那契查找  

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

斐波那契查找(黄金分割法查找)_第1张图片

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);
            }

        }
    }

你可能感兴趣的:(斐波那契查找(黄金分割法查找))