public static void QuicksortTask1(int[] elements, int left, int right, CustomCompareDelegate _compare)
        {
            int i = left, j = right;
            int pivot = elements[(left + right) / 2];

            //int tmp = 0;
            while (i <= j)
            {
                while (_compare(elements[i], pivot) < 0)
                {
                    i++;
                }

                while (_compare(elements[j], pivot) > 0)
                {
                    j--;
                }

                if (i <= j)
                {
                    // Swap
                    int tmp = elements[i];
                    elements[i] = elements[j];
                    elements[j] = tmp;

                    i++;
                    j--;
                }
            }
            List <Task> tasks = new List <Task>(2);

            if (left < j)
            {
                tasks.Add(
                    Task.Factory.StartNew(() =>
                                          { QuicksortTask1(elements, left, j, _compare); }));
            }

            if (i < right)
            {
                tasks.Add(
                    Task.Factory.StartNew(() =>
                                          { QuicksortTask1(elements, i, right, _compare); }));
            }
            Task.WaitAll(tasks.ToArray());
        }
        public static void Quicksort(int[] elements, int left, int right, CustomCompareDelegate _compare)
        {
            int i = left, j = right;
            int pivot = elements[(left + right) / 2];
            int tmp   = 0;

            while (i <= j)
            {
                while (_compare(elements[i], pivot) < 0)
                {
                    i++;
                }

                while (_compare(elements[j], pivot) > 0)
                {
                    j--;
                }

                if (i <= j)
                {
                    // Swap
                    tmp         = elements[i];
                    elements[i] = elements[j];
                    elements[j] = tmp;

                    i++;
                    j--;
                }
            }

            if (left < j)
            {
                Quicksort(elements, left, j, _compare);
            }

            if (i < right)
            {
                Quicksort(elements, i, right, _compare);
            }
        }
Exemple #3
0
        public static void TestQuickSort(int n)
        {
            var cc = new CustomIntComparerPointer();
            CustomCompareDelegate del = new CustomCompareDelegate(cc.Compare);

            IntPtr ptr = Marshal.GetFunctionPointerForDelegate(del);

            // Получили указатель на ту самую функцию
            void *p = ptr.ToPointer();

            var d = (CustomCompareDelegate)Marshal.GetDelegateForFunctionPointer((IntPtr)p, typeof(CustomCompareDelegate));

            Console.WriteLine(d(2, 3));

            Console.WriteLine("----------------------------------------------------------------");
            Console.WriteLine("Test Comparer  Quick Sort");
            int[] array = new int[n];
            Console.WriteLine("Generate data");
            RandomIteratorUsafeXorshiftEn rnd1 = new RandomIteratorUsafeXorshiftEn(n + 1);
            FastRandom rnd = new FastRandom();

            dh.StartWatch();
            for (int i = 0; i < n; i++)
            {
                array[i] = rnd.Next();
            }
            dh.StoptWatch();
            Console.WriteLine(dh.GetMessage());
            Console.WriteLine("Sort");
            dh.StartWatch();
            var c = new CustomIntComparerPointer();

            Quicksort(array, 0, n - 1, d);
            dh.StoptWatch();
            Console.WriteLine(dh.GetMessage());
            array = null;
            GarbachCollectorHelper.GBForceRun();
        }
        public static T BinarySearch(IList <T> list, CustomCompareDelegate <T> compare_fn)
        {
            int low  = 0;
            int high = list.Count - 1;

            while (low <= high)
            {
                int mid = (low + high) / 2;
                int cmp = compare_fn(list[mid]);
                if (cmp > 0)
                {
                    high = mid - 1;
                }
                else if (cmp < 0)
                {
                    low = mid + 1;
                }
                else
                {
                    return(list[mid]); // found
                }
            }
            return(default(T)); // not found
        }
        public static void QuicksortTaskLimited(int[] elements, int left, int right, int limit, CustomCompareDelegate _compare)
        {
            int i = left, j = right;
            int pivot = elements[(left + right) / 2];
            int tmp   = 0;

            while (i <= j)
            {
                while (_compare(elements[i], pivot) < 0)
                {
                    i++;
                }

                while (_compare(elements[j], pivot) > 0)
                {
                    j--;
                }

                if (i <= j)
                {
                    // Swap
                    tmp         = elements[i];
                    elements[i] = elements[j];
                    elements[j] = tmp;

                    i++;
                    j--;
                }
            }

            // Recursive calls
            List <Task> tasks = new List <Task>();

            if (left < j)
            {
                if (j - left < limit)
                {
                    Quicksort(elements, left, j, _compare);
                }
                else
                {
                    //Console.WriteLine(j - left);
                    tasks.Add(
                        Task.Factory.StartNew(() => { QuicksortTaskLimited(elements, left, j, limit, _compare); })
                        );
                }
            }

            if (i < right)
            {
                if (right - i < limit)
                {
                    Quicksort(elements, i, right, _compare);
                }
                else
                {
                    //Console.WriteLine(right - i);
                    tasks.Add(
                        Task.Factory.StartNew(() => { QuicksortTaskLimited(elements, i, right, limit, _compare); })
                        );
                }
            }
            Task.WaitAll(tasks.ToArray());
        }