public void MinHeapInitialises()
        {
            int testOrder = 2;
            var minDHeap  = new MinDHeap <int>(testOrder);

            Assert.IsNotNull(minDHeap);
        }
        internal static IEnumerable <T> MergeBy <T, TKey>(IEnumerable <IEnumerable <T> > lists, Func <T, TKey> keySelector, IComparer <TKey> comparer, bool descending)
        {
            var initialItems = lists
                               .Select(l => l.GetEnumerator())
                               .Where(i => i.MoveNext());

            IComparer <T> keyComparer = comparer != null ?
                                        new KeySelectorComparer <T, TKey>(keySelector, comparer) :
                                        new KeySelectorComparer <T, TKey>(keySelector);

            var enumerableComparer = new EnumeratorComparer <T>(keyComparer);

            DHeap <IEnumerator <T> > heap;

            if (descending)
            {
                heap = new MaxDHeap <IEnumerator <T> >(2, initialItems, enumerableComparer);
            }
            else
            {
                heap = new MinDHeap <IEnumerator <T> >(2, initialItems, enumerableComparer);
            }

            while (!heap.IsEmpty)
            {
                var i = heap.RemoveRoot();
                yield return(i.Current);

                if (i.MoveNext())
                {
                    heap.Insert(i);
                }
            }
        }
        public void MinHeapInitialisesAndInsertsSpecifiedCollection()
        {
            int         testOrder      = 2;
            IList <int> testCollection = new List <int> {
                50, 51, 38, 37, 23, 11, 5, 3
            };

            var minDHeap = new MinDHeap <int>(testOrder, testCollection.Randomize());

            Assert.AreEqual(testCollection.Count, minDHeap.Count);
        }
        public void MinHeapRemoveRootReturnsSmallestValue()
        {
            int         testOrder      = 2;
            IList <int> testCollection = new List <int> {
                50, 51, 38, 37, 23, 11, 5, 3
            };

            var minDHeap = new MinDHeap <int>(testOrder, testCollection.Randomize());

            int root = minDHeap.RemoveRoot();

            Assert.AreEqual(3, root);
        }
        public void MinHeapMovesNextSmallestValueToRootAfterRemoveRoot()
        {
            int         testOrder      = 2;
            IList <int> testCollection = new List <int> {
                50, 51, 38, 37, 23, 11, 5, 3
            };

            var minDHeap = new MinDHeap <int>(testOrder, testCollection.Randomize());

            minDHeap.RemoveRoot();

            int newRoot = minDHeap.Peek();

            Assert.AreEqual(5, newRoot);
        }
        public void MinHeapDoesNotInsertItemAsRootIfItemIsLargerThanOriginalRoot()
        {
            int         testOrder      = 2;
            IList <int> testCollection = new List <int> {
                50, 51, 38, 37, 23, 11, 5, 3
            };

            var minDHeap = new MinDHeap <int>(testOrder, testCollection.Randomize());

            int originalRoot = minDHeap.Peek();

            minDHeap.Insert(4);

            int newRoot = minDHeap.Peek();

            Assert.AreEqual(3, originalRoot);
            Assert.AreEqual(3, newRoot);
        }
        public void MinHeapSupportsConsumingEnumerable()
        {
            int testOrder = 2;

            IList <int> testCollection = new List <int> {
                50, 51, 38, 37, 23, 11, 5, 3
            };

            var minDHeap = new MinDHeap <int>(testOrder, testCollection.Randomize());

            var consumingEnumerator = minDHeap.GetConsumingEnumerable().GetEnumerator();

            Assert.DoesNotThrow(() =>
            {
                while (consumingEnumerator.MoveNext())
                {
                    //ignore empty block
                }
            });
        }
        public void MinHeapConsumingEnumerableRemovesAllElements()
        {
            const int expectedCount = 0;

            int testOrder = 2;

            IList <int> testCollection = new List <int> {
                50, 51, 38, 37, 23, 11, 5, 3
            };

            var minDHeap = new MinDHeap <int>(testOrder, testCollection.Randomize());

            var consumingEnumerator = minDHeap.GetConsumingEnumerable().GetEnumerator();

            while (consumingEnumerator.MoveNext())
            {
                //ignore empty block
            }

            Assert.AreEqual(expectedCount, minDHeap.Count);
        }
        public void MinHeapInsertsItemInCollectionAsRootIfItemIsSmallerThanOriginalRoot()
        {
            int testOrder = 2;

            IList <int> testCollection = new List <int> {
                50, 51, 38, 37, 23, 11, 5, 3
            };
            IList <int> newCollection = new List <int> {
                2, 4, 6, 8, 10, 12, 14, 16, 18
            };

            var minDHeap = new MinDHeap <int>(testOrder, testCollection.Randomize());

            int originalRoot = minDHeap.Peek();

            minDHeap.InsertRange(newCollection.Randomize());

            int newRoot = minDHeap.Peek();

            Assert.AreEqual(3, originalRoot);
            Assert.AreEqual(2, newRoot);
        }