C++自定义实现最大堆和最小堆

最大堆实现代码

template<class T>
class max_heap
{
    int sz;
    int num;
    T* elements;
    void shift_down(int);
    void shift_up(int);
public:
    max_heap(int s) :sz(s) { elements = new T[s]; num = 0; }
    ~max_heap() { delete[]elements; }
    bool empty() { return num == 0; }
    int size() { return num; }
    int max_sz() { return sz; }
    bool insert(T x);
    bool pop();
    T top() { T ret = elements[0]; return ret; }
    T* __top__() { return &T[0]; }
};
template<class T>
void max_heap<T>::shift_down(int start)
{
    int n = num;
    int child = 2 * start + 1;
    T temp = elements[start];
    // 循环比较左、右孩子
    while (child < n) {
        // 取左、右孩子中的较小者,保证下标小于n
        if (child + 1 < n && elements[child] < elements[child + 1])
            child++;
        if (temp >= elements[child])
            break;
        if (child % 2 == 0) {
            elements[child / 2 - 1] = elements[child];
        }
        else {
            elements[child / 2] = elements[child];
        }
        // 指向左孩子
        child = 2 * child + 1;
    }
    if (child % 2 == 0) {
        elements[child / 2 - 1] = temp;
    }
    else {
        elements[child / 2] = temp;
    }
}
template<class T>
void max_heap<T>::shift_up(int start) {
    int j = start, i = (j - 1) / 2;
    T temp = elements[j];
    while (j > 0) {
        if (elements[i] >= temp)break;
        else {
            elements[j] = elements[i];
            j = i;
            i = (i - 1) / 2;
        }
        elements[j] = temp;
    }
}

template<class T>
bool max_heap<T>::insert(T e) {
    if (num + 1 >= sz) {
        printf("堆已满,无法再添加新元素!");
        return false;
    }
    elements[num] = e;
    shift_up(num);
    num++;
    return true;
}
template<class T>
bool max_heap<T>::pop() {
    if (!num) {
        printf("堆空,无法删除元素!");
        return false;
    }
    elements[0] = elements[num - 1];
    num--;
    shift_down(0);
    return true;
}

最小堆实现

template<class T>
class min_heap
{
	int sz;
	int num;
	T* elements;
    void shift_down(int);
    void shift_up(int);
public:
    min_heap(int s) :sz(s) { elements = new T[s]; num = 0; }
	~min_heap() { delete[]elements; }
    bool empty() { return num == 0; }
    int size() { return num; }
    int max_sz() { return sz; }
	bool insert(T x);
	bool pop();
	T top() { T ret = elements[0]; return ret; }
    T* __top__() { return &T[0]; }
};
template<class T>
void min_heap<T>::shift_down(int start)
{
	int n = num;
	int child = 2 * start + 1;
    T temp = elements[start];
    // 循环比较左、右孩子
    while (child < n) {
        // 取左、右孩子中的较小者,保证下标小于n
        if (child + 1 < n && elements[child] > elements[child + 1])
            child++;
        if (temp <= elements[child])
            break;
        if (child % 2 == 0) {
            elements[child / 2 - 1] = elements[child];
        }
        else {
            elements[child / 2] = elements[child];
        }
        // 指向左孩子
        child = 2 * child + 1;
    }
    if (child % 2 == 0) {
        elements[child / 2 - 1] = temp;
    }
    else {
        elements[child / 2] = temp;
    }
}
template<class T>
void min_heap<T>::shift_up(int start) {
    int j = start, i = (j - 1) / 2;
    T temp = elements[j];
    while (j > 0) {
        if (elements[i] <= temp)break;
        else {
            elements[j] = elements[i];
            j = i;
            i = (i - 1) / 2;
        }
        elements[j] = temp;
    }
}

template<class T>
bool min_heap<T>::insert(T e) {
    if (num + 1 >= sz) {
        printf("堆已满,无法再添加新元素!");
        return false;
    }
    elements[num] = e;
    shift_up(num);
    num++;
    return true;
}
template<class T>
bool min_heap<T>::pop() {
    if (!num) {
        printf("堆空,无法删除元素!");
        return false;
    }
    elements[0] = elements[num - 1];
    num--;
    shift_down(0);
    return true;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值