数据结构-最大堆(Heap)

C++实现最大堆

#include 
#include 
#include 

template
class Heap {
public:
    Heap() {
        _data.resize(1); 
    }
    void push(T value) {
        _data.emplace_back(value);
        nodeUp(_data.size() - 1);
    }

    void pop(size_t index = 1) {
        if (index < 1 || index > _data.size() - 1) {
            return;
        }
        if (index != _data.size() - 1) {
            _data[index] = _data[_data.size() - 1];
        }
        _data.resize(_data.size() - 1);
        nodeDown(index);
    }

    T top() {
        return _data[1];
    }

    size_t size() {
        return _data.size() - 1;
    }
private:
    void nodeUp(size_t index) {
        if (index <= 1) {
            return;
        }
        size_t parent = index / 2;
        if (_data[index] > _data[parent]) {
            auto temp = _data[index];
            _data[index] = _data[parent];
            _data[parent] = temp;
        }
        nodeUp(parent);
    }

    void nodeDown(size_t index) {
        auto left = index * 2;
        auto right = left + 1;
        if (left > _data.size() - 1) {
            return;
        }
        if (right > _data.size() - 1) {
            if (_data[left] > _data[index]) {
                auto temp = _data[left];
                _data[left] = _data[index];
                _data[index] = temp;
                nodeDown(left);
            }
            else {
                return;
            }
        }
        else {
            if (_data[index] > _data[left] && _data[index] > _data[right]) {
                return;
            }
            if (_data[left] > _data[index] && _data[left] > _data[right]) {
                auto temp = _data[left];
                _data[left] = _data[index];
                _data[index] = temp;
                nodeDown(left);
            }
            else if (_data[right] > _data[index] && _data[right] > _data[left]) {
                auto temp = _data[right];
                _data[right] = _data[index];
                _data[index] = temp;
                nodeDown(right);
            }
        }
    }
private:
    std::vector _data;
};
  • 进行简单的测试
int main() {
    auto h = Heap<>();
    srand(time(0));
    for (size_t i = 0; i < 20; ++i) {
        int a = rand() % 1000;
        printf("%d ", a);
        h.push(a);
    }
    printf("\n");
    for (size_t i = 0; i < 20; i++) {
        int a = h.top();
        printf("%d ", a);
        h.pop();
    }
    printf("\n%d", h.size());
    return 0;
}
  • 结果
    在这里插入图片描述

你可能感兴趣的:(笔记,数据结构)