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