Exemple #1
0
        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);
        }
Exemple #2
0
 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;
     }
 }
Exemple #3
0
 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);
 }
Exemple #4
0
        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);
        }
Exemple #5
0
 static public int UpperBound <T> (this T[] arr, ref T val, RefComparison <T> comp)
 {
     return(arr.UpperBound(0, arr.Length, ref val, comp));
 }
Exemple #6
0
 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);
 }