【数据结构】最大堆和最小堆

本文深入探讨了堆数据结构,包括最大堆和最小堆的概念、性质及实现代码。详细介绍了堆作为完全二叉树的特性,以及如何通过模板类在C++中实现堆的插入、删除和查找操作。

定义

最大堆: 一个完全二叉树结构体。同时满足所有父节点大于等于子节点。
最大堆: 一个完全二叉树结构体。同时满足所有父节点小于等于子节点。

性质

  1. 对于最大堆,根节点是最大值
  2. 对于N个节点的堆,其深度为 O ( l g N ) O(lgN) O(lgN).

Code: MinHeap

代码应该没问题,在洛谷里全AC。

#include <cstring>

template <typename ValueType>
class MinHeap{
public:
	MinHeap();
	~MinHeap();
	void push(ValueType const &n);
	void pop();
	ValueType top();
	int size();
	bool empty();
private:
	ValueType* heap;
	int len;
};

template <typename ValueType>
MinHeap<ValueType>::MinHeap(){
	heap = new ValueType[10001];
	len = 0;
	memset(heap, 0, sizeof(heap));
}

template <typename ValueType>
MinHeap<ValueType>::~MinHeap(){
	delete []heap;
}

template <typename ValueType>
void MinHeap<ValueType>::push(ValueType const & n){
	heap[++len] = n;
	int son = len, father = son / 2;
	ValueType tmp;
	while(heap[son] < heap[father] && father >= 1){
		swap(heap[son],heap[father]);
		son = father, father = son / 2;
	}
}

template <typename ValueType>
void MinHeap<ValueType>::pop(){
	swap(heap[1],heap[len]);
	heap[len--] = 0;
	int father = 1, son = 2;
	while(son <= len){
		if(son < len && heap[son] > heap[son+1]) son++;
		if(heap[father] > heap[son]){
			swap(heap[father], heap[son]);
			father = son, son = father * 2;
		}
		else break;
	}
}

template <typename ValueType>
ValueType MinHeap<ValueType>::top(){
	return heap[1];
}

template <typename ValueType>
int MinHeap<ValueType>::size(){
	return len;
}

template <typename ValueType>
bool MinHeap<ValueType>::empty(){
	return len;
}

Code: MaxHeap

#include <cstring>

template <typename ValueType>
class MaxHeap{
public:
	MaxHeap();
	~MaxHeap();
	void push(ValueType const &n);
	void pop();
	ValueType top();
	int size();
	bool empty();
private:
	ValueType* heap;
	int len;
};

template <typename ValueType>
MaxHeap<ValueType>::MaxHeap(){
	heap = new ValueType[10001];
	len = 0;
	memset(heap, 0, sizeof(heap));
}

template <typename ValueType>
MaxHeap<ValueType>::~MaxHeap(){
	delete []heap;
}

template <typename ValueType>
void MaxHeap<ValueType>::push(ValueType const & n){
	heap[++len] = n;
	int son = len, father = son / 2;
	ValueType tmp;
	while(heap[son] > heap[father] && father >= 1){
		swap(heap[son],heap[father]);
		son = father, father = son / 2;
	}
}

template <typename ValueType>
void MaxHeap<ValueType>::pop(){
	swap(heap[1],heap[len]);
	heap[len--] = 0;
	int father = 1, son = 2;
	while(son <= len){
		if(son < len && heap[son] < heap[son+1]) son++;
		if(heap[father] < heap[son]){
			swap(heap[father], heap[son]);
			father = son, son = father * 2;
		}
		else break;
	}
}

template <typename ValueType>
ValueType MaxHeap<ValueType>::top(){
	return heap[1];
}

template <typename ValueType>
int MaxHeap<ValueType>::size(){
	return len;
}

template <typename ValueType>
bool MaxHeap<ValueType>::empty(){
	return len;
}

特别感谢洛谷这位大大

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值