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(); }
/// <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()); // 下次迭代的时候从这里继续执行。 } }
/// <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()); // 下次迭代的时候从这里继续执行。 } }