namespace Search { using System; public static partial class Extensions { /// Use Binary Search to find index of GLB for value /// type of entries and value /// array of entries /// search value /// entries must be in ascending order /// index into entries of GLB for value public static int BinarySearchForGLB(this T[] entries, T value) where T : IComparable { return entries.BinarySearchForGLB(value, 0, entries.Length - 1); } /// Use Binary Search to find index of GLB for value /// type of entries and value /// array of entries /// search value /// leftmost index to search /// rightmost index to search /// entries must be in ascending order /// index into entries of GLB for value public static int BinarySearchForGLB(this T[] entries, T value, int left, int right) where T : IComparable { while (left <= right) { var middle = left + (right - left) / 2; if (entries[middle].CompareTo(value) < 0) left = middle + 1; else right = middle - 1; } //[Assert]left == right + 1 // GLB: entries[right] < value && value <= entries[right + 1] return right; } /// Use Binary Search to find index of LUB for value /// type of entries and value /// array of entries /// search value /// entries must be in ascending order /// index into entries of LUB for value public static int BinarySearchForLUB(this T[] entries, T value) where T : IComparable { return entries.BinarySearchForLUB(value, 0, entries.Length - 1); } /// Use Binary Search to find index of LUB for value /// type of entries and value /// array of entries /// search value /// leftmost index to search /// rightmost index to search /// entries must be in ascending order /// index into entries of LUB for value public static int BinarySearchForLUB(this T[] entries, T value, int left, int right) where T : IComparable { while (left <= right) { var middle = left + (right - left) / 2; if (entries[middle].CompareTo(value) <= 0) left = middle + 1; else right = middle - 1; } //[Assert]left == right + 1 // LUB: entries[left] > value && value >= entries[left - 1] return left; } } }