static void Main(string[] args)
        {
            Console.WriteLine("Enter the number of elements in queue:");
            var            input = Console.ReadLine();
            MaxPQ <string> pq;
            int            number;

            while (!int.TryParse(input, out number))
            {
                Console.WriteLine("Enter a valid number:");
                input = Console.ReadLine();
            }

            pq = new MaxPQ <string>(number);

            while (number > 0)
            {
                Console.WriteLine("Enter keys");
                string entry = Console.ReadLine();
                pq.Insert(entry);
                number--;
            }

            while (!pq.IsEmpty)
            {
                Console.WriteLine(pq.DeleteMax());
            }
        }
        /// <summary>
        /// 根据指定数组初始化面向中位数的堆。
        /// </summary>
        /// <param name="keys">初始数组。</param>
        public MedianPQ(Key[] keys)
        {
            minPQ = new MinPQ <Key>();
            maxPQ = new MaxPQ <Key>();

            if (keys.Length == 0)
            {
                n      = 0;
                median = default(Key);
                return;
            }

            n      = keys.Length;
            median = keys[0];
            for (var i = 1; i < keys.Length; i++)
            {
                if (median.CompareTo(keys[i]) < 0)
                {
                    minPQ.Insert(keys[i]);
                }
                else
                {
                    maxPQ.Insert(keys[i]);
                }
            }

            UpdateMedian();
        }
Esempio n. 3
0
 /// <summary>
 /// 插入一个新的值。
 /// </summary>
 /// <param name="v">待插入的新值。</param>
 public void Insert(Key v)
 {
     n++;
     MinMaxNode.GetNodes(v, n, out var minNode, out var maxNode);
     maxPQ.Insert(maxNode);
     minPQ.Insert(minNode);
 }
        /// <summary>
        /// 向面向中位数的堆中插入一个元素。
        /// </summary>
        /// <param name="key">需要插入的元素。</param>
        public void Insert(Key key)
        {
            if (n == 0)
            {
                n++;
                median = key;
                return;
            }

            if (key.CompareTo(median) < 0)
            {
                maxPQ.Insert(key);
            }
            else
            {
                minPQ.Insert(key);
            }

            n++;
            UpdateMedian();
        }
        /// <summary>
        /// 获取堆的迭代器,元素以降序排列。
        /// </summary>
        /// <returns></returns>
        public IEnumerator <Key> GetEnumerator()
        {
            MaxPQ <Key> copy = new MaxPQ <Key>(this.n);

            for (int i = 1; i <= this.n; i++)
            {
                copy.Insert(this.pq[i]);
            }

            while (!copy.IsEmpty())
            {
                yield return(copy.DelMax()); // 下次迭代的时候从这里继续执行。
            }
        }
Esempio n. 6
0
        /// <summary>
        /// 获取堆的迭代器,元素以降序排列。
        /// </summary>
        /// <returns>最大堆的迭代器。</returns>
        public IEnumerator <Key> GetEnumerator()
        {
            var copy = new MaxPQ <Key>(n);

            for (var i = 1; i <= n; i++)
            {
                copy.Insert(pq[i]);
            }

            while (!copy.IsEmpty())
            {
                yield return(copy.DelMax()); // 下次迭代的时候从这里继续执行。
            }
        }