public void Should_select_fast_on_reverseSortedArray()
        {
            var itemsCount = 8000;
            var items      = Enumerable.Range(0, itemsCount).ToArray();
            var comparer   = new CountedComparer <int>(Comparer <int> .Default);
            var result     = items.QuickSelect(6000, order: QuickselectSortOrder.Descending, comparer: comparer);

            comparer.Called.Should().BeLessThan(itemsCount * 7); // Avg Performace O(n)
            AssertQuickSortResult(QuickselectSortOrder.Descending, items, 6000, result);
        }
        public void Should_select_min_and_max_in_N_comparisons(bool min)
        {
            var itemsCount = 8000;
            var items      = Enumerable.Range(0, itemsCount).ToArray();
            var comparer   = new CountedComparer <int>(Comparer <int> .Default);
            var result     = items.QuickSelect(min ? 0 : itemsCount, order: QuickselectSortOrder.Descending, comparer: comparer);

            comparer.Called.Should().Be(itemsCount);
            AssertQuickSortResult(QuickselectSortOrder.Descending, items, min ? 0 : itemsCount - 1, result);
        }
        public void Should_select_fast_on_sameData(QuickselectSortOrder order)
        {
            var itemsCount = 8000;
            var items      = Enumerable.Repeat(new string('c', 10), itemsCount).ToArray();
            var comparer   = new CountedComparer <string>(Comparer <string> .Default);
            var result     = items.QuickSelect(6000, order: order, comparer: comparer);

            comparer.Called.Should().BeLessThan(itemsCount * 7); // Avg Performace O(n)
            AssertQuickSortResult(order, items, 6000, result);
        }
        public void Should_select_fast_on_similarData(QuickselectSortOrder order)
        {
            var itemsCount = 800;
            var items      = new[] { "c", "a", "b", "zf", "e", "f", "w", "we", "z", "gg" }
            .SelectMany(prefix => Enumerable.Repeat(prefix + new string('c', 10), itemsCount))
            .ToArray();
            var comparer = new CountedComparer <string>(Comparer <string> .Default);
            var result   = items.QuickSelect(6000, order: order, comparer: comparer);

            comparer.Called.Should().BeLessThan(items.Length * 7); // Avg Performace O(n)
            AssertQuickSortResult(order, items, 6000, result);
        }