Exemplo n.º 1
0
 private static void SwapIfGreater(double[] keys, Unwrapping3.edge[] elements, int a, int b)
 {
     if (a != b)
     {
         if (keys[a] > keys[b])
         {
             Unwrapping3.edge el  = elements[a];
             double           key = keys[a];
             keys[a]     = keys[b];
             keys[b]     = key;
             elements[a] = elements[b];
             elements[b] = el;
         }
     }
 }
Exemplo n.º 2
0
        public static void ArrayPreprocessing(double[] keys, Unwrapping3.edge[] elements,
                                              int left, int right, ConcurrentBag <int> bounds, int depth_limit = 2, int depth = 0)
        {
            if (depth > depth_limit)
            {
                return;
            }
            do
            {
                int i      = left;
                int j      = right;
                int middle = i + ((j - i) >> 1);
                SwapIfGreater(keys, elements, i, middle);
                SwapIfGreater(keys, elements, i, j);
                SwapIfGreater(keys, elements, middle, j);
                double x = keys[middle];
                do
                {
                    while (keys[i] < x)
                    {
                        i++;
                    }
                    while (x < keys[j])
                    {
                        j--;
                    }
                    if (i > j)
                    {
                        break;
                    }
                    if (i < j)
                    {
                        Unwrapping3.edge el  = elements[i];
                        double           key = keys[i];
                        keys[i]     = keys[j];
                        keys[j]     = key;
                        elements[i] = elements[j];
                        elements[j] = el;
                    }
                    i++;
                    j--;
                } while (i <= j);
                depth++;
                // Unwrapping2.edge el1 = elements[i];
                //Unwrapping2.edge el2 = elements[j];
                if (depth_limit >= depth)
                {
                    bounds.Add(i);
                    //bounds.Add(j);
                }

                //ArrayPreprocessing(keys, elements, left, j, bounds, depth_limit, depth);
                //ArrayPreprocessing(keys, elements, i, right, bounds, depth_limit, depth);


                Task t1 = Task.Factory.StartNew(() =>
                {
                    ArrayPreprocessing(keys, elements, left, j, bounds, depth_limit, depth);
                });

                Task t2 = Task.Factory.StartNew(() =>
                {
                    ArrayPreprocessing(keys, elements, i, right, bounds, depth_limit, depth);
                });
                Task.WaitAll(t1, t2);


                right = j;
                left  = i;
            } while (left < right);
        }