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