コード例 #1
0
        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);
            }
        }
コード例 #2
0
 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());
     }
 }
コード例 #3
0
 static void AddNumber(int num, MinHeap min, MaxHeap max)
 {
     if (min.Length() == 0 || num < min.Peek())
     {
         min.Add(num);
     }
     else
     {
         max.Add(num);
     }
 }
コード例 #4
0
 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());
     }
 }