[C++] 数据结构——最大堆

参考了许多数据结构与算法的教材,并未涉及到最大堆讲解及实现

所以自己参考清华大学出版社的教材实现了最大堆

#include 
#include 
using namespace std;

const int DefaultSize = 100;

template 
class MaxHeap {
public:
    MaxHeap(int sz = DefaultSize);
    MaxHeap(T arr[], int n);
    ~MaxHeap() { delete[]heap; }
    bool Insert(const T& x); // 插入
    bool RemoveMax(); // 删除
    bool isEmpty()const; // 是否为空
    bool isFull()const; // 是否已满
    void Display()const {
        for (int i = 0; i < CurrentSize; i++)
            cout << heap[i] << "  ";
            cout << endl;
    }
private:
    T* heap; // 动态数组存储最小堆
    int CurrentSize; // 目前最小堆的结点数
    void SiftDown(int start, int m); // 下滑
    void SiftUp(int start); // 上滑
    
};

// 构造函数
template 
MaxHeap::MaxHeap(int sz) {
    heap = new T[sz]; // 创建堆空间
    CurrentSize = 0;
};

// 构造函数
template 
MaxHeap::MaxHeap(T arr[], int n) {
    // 为什么求最后非叶要CurrentSize减去2,再除以2,而不是减去1,再除以2
    // 因为最后一个数组下标是CurrentSize-1,又因为:左结点j = 2 * i +
    //  1,知道j,想求i。可知是:i = (j - 1) / 2;所以,就出现了
    // CurrentPos = (CurrentSize - 2) / 2
    heap = new T[DefaultSize]; // 创建堆空间
    CurrentSize = n; // 当前堆大小
    for (int i = 0; i < n; i++)
        heap[i] = arr[i];
    int CurrentPos = (CurrentSize - 2) / 2; // 最后非叶
    while (CurrentPos >= 0) {
        // 从下到上逐渐扩大,形成堆
        SiftDown(CurrentPos, CurrentSize - 1);
        // 到CurrentSize-1为止
        CurrentPos--;
    }
};


template 
void MaxHeap::SiftUp(int start) {
    //上滑:从下至上,i为start,j为i的双亲
    int i = start, j = (i - 1) / 2;
    T temp = heap[i];
    while (i> 0) {
        if (temp <= heap[j]) break;
        else {
            heap[i] = heap[j];
            i = j;
            j = (j - 1) / 2;
        }
        heap[i] = temp;
    }
};

template 
void MaxHeap::SiftDown(int start, int m) {
    //下滑:从上start至下m,i为start,j为i的左子女
    int i = start, j = 2 * i + 1;
    T temp = heap[i];
    while (j <= m) {
        if (j < m && heap[j] < heap[j + 1])j++;
        if (heap[j] <= temp)break;
        else {
            heap[i] = heap[j];
            i = j;
            j = 2 * j + 1;
        }
        heap[i] = temp;
    }
};

template 
bool MaxHeap::Insert(const T& x) {
    // 在堆中插入新元素x
    if (CurrentSize == DefaultSize) { // 堆满
        std::cout << "堆已满!\n";
        return false;
    }
    heap[CurrentSize] = x; // 插在表尾
    SiftUp(CurrentSize); // 向上调整
    CurrentSize++;
    return true;
}


template 
bool MaxHeap::RemoveMax() {
    int x;

    if (!CurrentSize) {
        std::cout << "堆已空!\n";
        return false;
    }
    x = heap[0]; // 最大元素出列
    heap[0] = heap[CurrentSize - 1]; // 用最后一个元素填补
    CurrentSize--;
    SiftDown(0, CurrentSize - 1); // 从0位置开始向下调整
    return true;
}

// 判断堆是否已空
template 
bool MaxHeap::isEmpty()const {
    if (!CurrentSize)
        return true;
    return false;
}

// 判断堆是否已满
template 
bool MaxHeap::isFull()const {
    if (CurrentSize == DefaultSize)
        return true;
    return false;
}


int main() {
    int x, len;
    int arr[] = { 10,6,18,2,9,4,16 };
    len = sizeof(arr) / sizeof(arr[0]);
    MaxHeap h = MaxHeap(arr, len);
    //插入x值并输出堆
    cout << "请输入要插入的值:";
    cin >> x;
    h.Insert(x);
    h.Display();
    cout << "******************************" << endl;
    //删除最大值并输出堆
    h.RemoveMax();
    h.Display();

    return 0;
}

运行结果如下图:

[C++] 数据结构——最大堆_第1张图片

你可能感兴趣的:(数据结构,c++,数据结构,开发语言,堆排序)