static public ArraySlice <T> EqualSlice <T> (this T[] arr, ref T val, RefComparison <T> comp) { int b = 0, end = arr.Length; return(arr.EqualRange(ref b, ref end, ref val, comp) ? new ArraySlice <T>(arr, b, end) : ArraySlice <T> .Empty); }
private static void SwapIfGreaterWithItems <T>(T[] keys, RefComparison <T> comparison, int a, int b) { if ((a != b) && (comparison(ref keys[a], ref keys[b]) > 0)) { T local = keys[a]; keys[a] = keys[b]; keys[b] = local; } }
internal static void QuickSort <T>(T[] keys, int left, int right, RefComparison <T> comparison) { do { int a = left; int b = right; int mid = a + ((b - a) >> 1); SwapIfGreaterWithItems(keys, comparison, a, mid); SwapIfGreaterWithItems(keys, comparison, a, b); SwapIfGreaterWithItems(keys, comparison, mid, b); T y = keys[mid]; do { while (comparison(ref keys[a], ref y) < 0) { a++; } while (comparison(ref y, ref keys[b]) < 0) { b--; } if (a > b) { break; } if (a < b) { T local2 = keys[a]; keys[a] = keys[b]; keys[b] = local2; } a++; b--; }while (a <= b); if ((b - left) <= (right - a)) { if (left < b) { QuickSort(keys, left, b, comparison); } left = a; } else { if (a < right) { QuickSort(keys, a, right, comparison); } right = b; } }while (left < right); }
static public bool EqualRange <T> ( this T[] arr, ref int begin, ref int end, ref T val, RefComparison <T> comp) { int lo = arr.LowerBound(begin, end, ref val, comp); if (lo == end) { begin = end; } else if (lo == begin && comp(ref arr[begin], ref val) > 0) { //TODO end = begin; } else { end = arr.UpperBound(begin = lo, end, ref val, comp); } return(begin != end); }
static public int UpperBound <T> (this T[] arr, ref T val, RefComparison <T> comp) { return(arr.UpperBound(0, arr.Length, ref val, comp)); }
static public int UpperBound <T> (this T[] arr, int begin, int end, ref T val, RefComparison <T> comp) { while (begin < end) { int mid = (begin + end) / 2; if (comp(ref arr[mid], ref val) <= 0) { begin = mid + 1; } else { end = mid; } } return(begin); }