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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }