/// <summary> /// Fibonacci Search /// </summary> /// <param name="elem"></param> /// <param name="lo"></param> /// <param name="hi"></param> /// <param name="e"></param> /// <returns></returns> private static int FibSearch(T[] elem, int lo, int hi, T e) { Fib fib = new Fib(hi - lo); while (lo < hi) { while (hi - lo < fib.Get()) { fib.Prev(); } int mi = lo + fib.Get() - 1; if (Lt(e, elem[mi])) { hi = mi; } else { if (Lt(elem[mi], e)) { lo = mi + 1; } else { return(mi); } } } return(-1); }
public void t() { var fib = new[] { 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233 }; for (int i = 0; i < fib.Length; ++i) { Assert.AreEqual(fib[i], Fib.Get(i)); } }