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