最大堆c++

最大堆(Max-Heap)是一種二叉堆,其中每個節點的值都不小於其子節點的值。最大堆可以用來構建優先佇列,其中堆頂的元素總是佇列中最大的元素。

在C++中,可以使用模板類來實現最大堆。以下是一個簡單的最大堆實現示例:

#include <iostream>
#include <vector>

template <typename T>
class MaxHeap {
private:
    std::vector<T> data;
    int size;

    void swap(int i, int j) {
        T temp = data[i];
        data[i] = data[j];
        data[j] = temp;
    }

    void adjustHeap(int i) {
        int l = 2 * i + 1;
        int r = 2 * i + 2;
        int largest = i;

        if (l < size && data[l] > data[largest])
            largest = l;
        if (r < size && data[r] > data[largest])
            largest = r;
        if (largest != i) {
            swap(largest, i);
            adjustHeap(largest);
        }
    }

public:
    MaxHeap() : size(0) {}

    void push(T item) {
        data.push_back(item);
        size++;
        int i = size - 1;
        while (i > 0 && data[i / 2] < data[i]) {
            swap(i, i / 2);
            i /= 2;
        }
    }

    T pop() {
        if (size == 0)
            return T();
        T ret = data[0];
        data[0] = data[--size];
        if (size > 0) {
            int i = 0;
            while (i * 2 + 1 < size) {
                int j = i * 2 + 1;
                if (j < size - 1 && data[j + 1] > data[j])
                    j++;
                if (data[i] < data[j]) {
                    swap(i, j);
                    i = j;
                } else {
                    break;
                }
            }
        }
        return ret;
    }

    int size() const {
        return size;
    }

    bool empty() const {
        return size == 0;
    }
};

int main() {
    MaxHeap<int> heap;
    heap.push(10);
    heap.push(1);
    heap.push(5);
    heap.push(7);
    heap.push(2);

    while (!heap.empty()) {
        std::cout << heap.pop() << " ";
    }
    std::cout << std::endl;
    return 0;
}

在這個例子中,MaxHeap 類使用了一個 std::vector 來存儲數據,並提供了一些操作堆的方法,如 pushpopsizeemptyadjustHeap 函式用於在插入新元素後調整堆的形狀,swap 函式用於交換兩個元素的位置。

push 函式中,新元素被添加到堆的末尾,然後通過一個循環向上調整堆的形狀,直到新元素成為其父節點的最大子節點。在 pop 函式中,堆頂元素被彈出,然後通過一個循環向下調整堆的形狀,直到堆頂元素成為其子節點的最大值。

這個最大堆的實現是高效的,因為它使用了二叉堆的數據結構,插入和刪除最大元素的時間複雜度都是 O(log n)。