最小堆需要解释

Explanation needed for min heap

本文关键字:解释      更新时间:2023-10-16

我了解最小堆的基本工作原理,以下是Robert Sedgewick书中的实现:

    template <class Item>
class PQ 
  {
    private:
      Item *pq; 
      int N;
    public:
      PQ(int maxN)
        { pq = new Item[maxN]; N = 0; }
      int empty() const
        { return N == 0; }
      void insert(Item item)
        { pq[N++] = item; }
      Item getmax()
        { int max = 0;
          for (int j = 1; j < N; j++)
            if (pq[max] < pq[j]) max = j;
          exch(pq[max], pq[N-1]);  
          return pq[--N];
        }
  };

我无法理解的是getMax函数中的这两个语句:

          exch(pq[max], pq[N-1]);  
          return pq[--N];

为什么我们需要将 max 元素与倒数第二个插入元素中的元素交换?

他将max元素交换到末尾,然后"弹出"它;通过减少"size"变量(N),他实际上使最后一个元素(现在是max)元素无法访问,并且下次插入元素时将被覆盖。