private static void SortArrayOfLength2(ArrayLimit array_limit, int[] test_array) { if (test_array[array_limit.Bottom] > test_array[array_limit.Top]) { Swap(array_limit.Bottom, array_limit.Top, test_array); } }
static void DoQuickSort(ArrayLimit array_limit, int[] test_array) { if (array_limit.Size() <= 1) { return; } if (array_limit.Size() == 2) { SortArrayOfLength2(array_limit, test_array); return; } var pivot = choosePivot(array_limit, test_array); (var left, var right) = partitionAndReturnleftPivotArrayAndRightPivotArray(array_limit, pivot, test_array); DoQuickSort(left, test_array); DoQuickSort(right, test_array); }
public bool TryGetLimit(string type, out ArrayLimit limit) { return(_lookup.TryGetValue(type, out limit)); }
private static (ArrayLimit left, ArrayLimit right) partitionAndReturnleftPivotArrayAndRightPivotArray(ArrayLimit array_limit, int pivot, int[] array) { var i = array_limit.Bottom; var j = array_limit.Top - 1; Swap(pivot, array_limit.Top, array); while (j >= i) { if (array[i] <= array[array_limit.Top]) { ++i; } else { Swap(i, j, array); --j; } } pivot = Math.Max(i, j); Swap(array_limit.Top, pivot, array); return( new ArrayLimit { Bottom = array_limit.Bottom, Top = pivot - 1 }, new ArrayLimit { Bottom = pivot + 1, Top = array_limit.Top } ); }
private static int choosePivot(ArrayLimit array_limit, int[] test_array) => rnd.Next(array_limit.Bottom, array_limit.Top);