static void HeapAlgo() { int n = Convert.ToInt32(Console.ReadLine()); decimal median; MaxHeap max = new MaxHeap(n); MinHeap min = new MinHeap(n); for (int i = 0; i < n; i++) { int aItem = Convert.ToInt32(Console.ReadLine()); AddNumber(aItem, min, max); ReBalance(min, max); median = GetMedian(min, max); //int diff = max.Length() - min.Length(); //switch (diff) //{ // case 0: // if (aItem < median) // { // max.Add(aItem); // median = max.Peek(); // } // else // { // min.Add(aItem); // median = min.Peek(); // } // break; // case 1: // if (aItem < median) // { // min.Add(max.Poll()); // max.Add(aItem); // } // else // { // min.Add(aItem); // } // median = Decimal.Divide(min.Peek() + max.Peek(), 2); // break; // case -1: // if (aItem < median) // { // max.Add(aItem); // } // else // { // max.Add(min.Poll()); // min.Add(aItem); // } // median = Decimal.Divide(min.Peek() + max.Peek(), 2); // break; //} Console.WriteLine("{0:N1}", median); } }
static void ReBalance(MinHeap min, MaxHeap max) { if (min.Length() - max.Length() >= 2) { max.Add(min.Poll()); } else if (max.Length() - min.Length() >= 2) { min.Add(max.Poll()); } }
static void AddNumber(int num, MinHeap min, MaxHeap max) { if (min.Length() == 0 || num < min.Peek()) { min.Add(num); } else { max.Add(num); } }
static decimal GetMedian(MinHeap min, MaxHeap max) { if (min.Length() == max.Length()) { return(Decimal.Divide(min.Peek() + max.Peek(), 2)); } else if (min.Length() > max.Length()) { return(min.Peek()); } else { return(max.Peek()); } }