/// <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 DelMin() { // ⬇ 不可以交换操作顺序 ⬇ maxPQ.Remove(minPQ.Min().Pair.Index); Key key = minPQ.Min().Key; minPQ.DelMin(); // ⬆ 不可以交换操作顺序 ⬆ n--; return(key); }
/// <summary> /// 获取堆的迭代器,元素以升序排列。 /// </summary> /// <returns></returns> public IEnumerator <Key> GetEnumerator() { MinPQ <Key> copy = new MinPQ <Key>(this.n); for (int i = 1; i <= this.n; i++) { copy.Insert(this.pq[i]); } while (!copy.IsEmpty()) { yield return(copy.DelMin()); // 下次迭代的时候从这里继续执行。 } }
/// <summary> /// 获取堆的迭代器,元素以升序排列。 /// </summary> /// <returns></returns> public IEnumerator <Key> GetEnumerator() { var copy = new MinPQ <Key>(n); for (var i = 1; i <= n; i++) { copy.Insert(pq[i]); } while (!copy.IsEmpty()) { yield return(copy.DelMin()); // 下次迭代的时候从这里继续执行。 } }