// Driver code
        int GetMedianForStreamOfDataTest()
        {
            // In lieu of A, we can also use data read from a stream
            int[] A = { 5, 15, 1, 3, 2, 8, 7, 9, 10, 6, 11, 4 };

            int     median       = 0; // effective median
            MaxHeap leftMaxHeap  = new MaxHeap();
            MinHeap rightMinHeap = new MinHeap();

            for (int i = 0; i < A.Length; i++)
            {
                getMedian(A[i], ref median, leftMaxHeap, rightMinHeap);
                Console.Write(median + "  ");
            }
            return(0);
        }
Ejemplo n.º 2
0
        public static void testHeap()
        {
            Heap heap    = new Heap();
            var  numbers = new int[] { 5, 3, 8, 4, 1, 2, 10 };

            //heap.heapify(numbers);
            MaxHeap.heapify(numbers);

            //heap.insert(24);
            //heap.insert(15);
            //heap.insert(9);
            //heap.insert(12);
            //heap.insert(10);
            //heap.insert(3);
            //heap.insert(4);
            //heap.insert(1);
            //heap.insert(8);

            //heap.remove();
        }
        void getMedian(int e, ref int median, MaxHeap maxHeap, MinHeap minHeap)
        {
            // Are heaps balanced? If yes, sig will be 0
            int sig = Signum(maxHeap.GetCount(), minHeap.GetCount());

            switch (sig)
            {
            case 1:             // More elements in left (max) heap

                if (e < median) // current element fits in left (max) heap
                {
                    // Remore top element from left heap and insert into right heap
                    minHeap.Insert(maxHeap.ExtractTop());

                    // current element fits in left (max) heap
                    maxHeap.Insert(e);
                }
                else
                {
                    // current element fits in right (min) heap
                    minHeap.Insert(e);
                }

                // Both heaps are balanced
                median = Average(maxHeap.GetTop(), minHeap.GetTop());

                break;

            case 0:             // The left and right heaps contain same number of elements

                if (e < median) // current element fits in left (max) heap
                {
                    maxHeap.Insert(e);
                    median = maxHeap.GetTop();
                }
                else
                {
                    // current element fits in right (min) heap
                    minHeap.Insert(e);
                    median = minHeap.GetTop();
                }

                break;

            case -1:            // There are more elements in right (min) heap

                if (e < median) // current element fits in left (max) heap
                {
                    maxHeap.Insert(e);
                }
                else
                {
                    // Remove top element from right heap and insert into left heap
                    maxHeap.Insert(minHeap.ExtractTop());

                    // current element fits in right (min) heap
                    minHeap.Insert(e);
                }

                // Both heaps are balanced
                median = Average(maxHeap.GetTop(), minHeap.GetTop());

                break;
            }
        }