/// <summary> /// 根据指定数组初始化面向中位数的堆。 /// </summary> /// <param name="keys">初始数组。</param> public MedianPq(TKey[] keys) { _minPq = new MinPq <TKey>(); _maxPq = new MaxPq <TKey>(); if (keys.Length == 0) { _n = 0; _median = default; 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="capacity">初始容量。</param> public MedianPq(int capacity) { _maxPq = new MaxPq <TKey>((capacity - 1) / 2); _minPq = new MinPq <TKey>((capacity - 1) / 2); _n = 0; _median = default; }
/// <summary> /// 默认构造函数,构造一个面向中位数的堆。 /// </summary> public MedianPq() { _maxPq = new MaxPq <TKey>(); _minPq = new MinPq <TKey>(); _median = default; _n = 0; }
/// <summary> /// 根据已有元素建立一个最大-最小堆。(O(n)) /// </summary> /// <param name="keys">需要建堆的元素。</param> public MinMaxPq(TKey[] keys) { _n = keys.Length; var minNodes = new MinMaxNode[keys.Length]; var maxNodes = new MinMaxNode[keys.Length]; for (var i = 0; i < _n; i++) { MinMaxNode.GetNodes(keys[i], i + 1, out minNodes[i], out maxNodes[i]); } _minPq = new MinPq(minNodes); _maxPq = new MaxPq(maxNodes); }
/// <summary> /// 获取堆的迭代器,元素以降序排列。 /// </summary> /// <returns>最大堆的迭代器。</returns> public IEnumerator <TKey> GetEnumerator() { var copy = new MaxPq <TKey>(N); for (var i = 1; i <= N; i++) { copy.Insert(Pq[i]); } while (!copy.IsEmpty()) { yield return(copy.DelMax()); // 下次迭代的时候从这里继续执行。 } }
/// <summary> /// 构造一个指定容量的最大-最小堆。 /// </summary> /// <param name="capacity">堆的大小。</param> public MinMaxPq(int capacity) { _minPq = new MinPq(capacity); _maxPq = new MaxPq(capacity); _n = 0; }