/// <exception cref="System.Exception"/>
        public virtual void TestQuickSort()
        {
            QuickSort sorter = new QuickSort();

            SortRandom(sorter);
            SortSingleRecord(sorter);
            SortSequential(sorter);
            SortSorted(sorter);
            SortAllEqual(sorter);
            SortWritable(sorter);
            // test degenerate case for median-of-three partitioning
            // a_n, a_1, a_2, ..., a_{n-1}
            int Dsample = 500;

            int[] values = new int[Dsample];
            for (int i = 0; i < Dsample; ++i)
            {
                values[i] = i;
            }
            values[0] = values[Dsample - 1] + 1;
            TestIndexedSort.SampleSortable s = new TestIndexedSort.SampleSortable(values);
            values = s.GetValues();
            int Dss = (Dsample / 2) * (Dsample / 2);

            // Worst case is (N/2)^2 comparisons, not including those effecting
            // the median-of-three partitioning; impl should handle this case
            TestIndexedSort.MeasuredSortable m = new TestIndexedSort.MeasuredSortable(s, Dss);
            sorter.Sort(m, 0, Dsample);
            System.Console.Out.WriteLine("QuickSort degen cmp/swp: " + m.GetCmp() + "/" + m.GetSwp
                                             () + "(" + sorter.GetType().FullName + ")");
            Arrays.Sort(values);
            int[] check = s.GetSorted();
            Assert.True(Arrays.Equals(values, check));
        }
        /// <exception cref="System.Exception"/>
        public virtual void SortSingleRecord(IndexedSorter sorter)
        {
            int Sample = 1;

            TestIndexedSort.SampleSortable s = new TestIndexedSort.SampleSortable(Sample);
            int[] values = s.GetValues();
            sorter.Sort(s, 0, Sample);
            int[] check = s.GetSorted();
            Assert.True(Arrays.ToString(values) + "\ndoesn't match\n" + Arrays
                        .ToString(check), Arrays.Equals(values, check));
        }
        /// <exception cref="System.Exception"/>
        public virtual void SortRandom(IndexedSorter sorter)
        {
            int Sample = 256 * 1024;

            TestIndexedSort.SampleSortable s = new TestIndexedSort.SampleSortable(Sample);
            long seed = s.GetSeed();

            System.Console.Out.WriteLine("sortRandom seed: " + seed + "(" + sorter.GetType().
                                         FullName + ")");
            int[] values = s.GetValues();
            Arrays.Sort(values);
            sorter.Sort(s, 0, Sample);
            int[] check = s.GetSorted();
            Assert.True("seed: " + seed + "\ndoesn't match\n", Arrays.Equals
                            (values, check));
        }