public static int PartitionArray(int[] array, int beginIndex, int endIndex, QuickSortStatistics stats) { // assumptions: there are at least two elements in the input subarray // invariant: // all elements with index >= b are >= partition value (PV) // all elements with index <= a are < PV int partitionValue = array[endIndex]; int endLesserPartitionIndex = beginIndex - 1; int currentIndex = beginIndex; while (currentIndex < endIndex) { if (array[currentIndex] < partitionValue) { endLesserPartitionIndex++; ArrayUtility.Swap(array, currentIndex, endLesserPartitionIndex); stats.numSwaps++; } currentIndex++; } int partitionIndex = endLesserPartitionIndex + 1; ArrayUtility.Swap(array, partitionIndex, endIndex); stats.numSwaps++; return(partitionIndex); }
public static void Sort(int[] array, PartitionArrayFunc partitionFunc = null) { partitionFunc = partitionFunc ?? QuickSortClassicPartition.PartitionArray; QuickSort.stats = new QuickSortStatistics(); if (array == null || array.Length <= 1) { // null, empty, and singleton arrays are already sorted return; } QuickSortInternal(array, 0, array.Length - 1, partitionFunc); }
public void QuicSort_SmallArray_ReturnRightComparesCount(string testCase) { IQuickSortWithStatistics[] quicSortVersions = { new QuickSortWithLastReferenceElement(), new QuickSortWithFirstReferenceElement(), new QuickSortWithCalculatedReferenceElement() }; CompareCountTestData testData = CompareCountTestDataBuilder.CreateTestDate(testCase); for (int i = 0; i < quicSortVersions.Length; i++) { IQuickSortWithStatistics quickSort = quicSortVersions[i]; QuickSortStatistics statistics = quickSort.Sort(testData.InputCollection); Assert.That(statistics.ComparesCount, Is.EqualTo(testData.ExpectedCounts[i])); Assert.That(statistics.SortedCollection, Is.Ordered); } }
public static int PartitionArray(int[] array, int beginIndex, int endIndex, QuickSortStatistics stats) { // assumptions: there are at least two elements in the input subarray // invariant: // all elements with index >= b are >= partition value (PV) // all elements with index <= a are < PV int partitionValueIndex = endIndex; int partitionValue = array[partitionValueIndex]; int a = beginIndex - 1; int b = endIndex - 1; while (b > a + 1) { if (array[b] < partitionValue) { a++; ArrayUtility.Swap(array, a, b); stats.numSwaps++; } else { b--; } } if (array[b] < partitionValue) { b++; } int tmp = array[b]; array[b] = partitionValue; array[partitionValueIndex] = tmp; stats.numSwaps++; return(b); }