// 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); }
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; } }