/// <summary> /// 删除并返回中位数。 /// </summary> /// <returns>中位数。</returns> /// <exception cref="ArgumentOutOfRangeException">当堆为空时抛出该异常。</exception> /// <remarks>如果希望获得中位数但不将其删除,请使用 <see cref="Median"/>。</remarks> public Key DelMedian() { if (IsEmpty()) { throw new ArgumentOutOfRangeException("MedianPQ underflow!"); } var median = this.median; if (n == 1) { n--; this.median = default(Key); return(median); } // 从较大的一侧堆中取元素作为新的中位数。 if (minPQ.Size() > maxPQ.Size()) { this.median = minPQ.DelMin(); } else { this.median = maxPQ.DelMax(); } n--; return(median); }
/// <summary> /// 删除并返回最大值。 /// </summary> /// <returns>最大元素。</returns> public Key DelMax() { // ⬇ 不可以交换操作顺序 ⬇ minPQ.Remove(maxPQ.Max().Pair.Index); var key = maxPQ.Max().Key; maxPQ.DelMax(); // ⬆ 不可以交换操作顺序 ⬆ n--; return(key); }
/// <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()); // 下次迭代的时候从这里继续执行。 } }