介绍
我们所说的堆这种数据结构,通常指的是二叉堆,二叉堆是一棵完全二叉树。堆又可以分为最大堆和最小堆。最大堆即每个父结点都比它的两个子结点大,最小堆即每个父结点都比它的两个子结点小,本文以最大堆为例介绍堆这种数据结构。
思路
- 用数组存放堆中的元素,创建一个大小为n+1的连续空间data[0…n],data[1…n]用于存放堆中元素。
- 插入操作。设定一个count指向最后一个元素位置,data[++count] = 新插入的元素。插入后堆需要进行调整,保证满足最大堆的性质。
- 移出操作。设一个变量ret = data[1],再让data[1] = data[count],然后count- -,再对堆做一系列调整并返回ret。
具体操作看代码:
代码实现
#include<bits/stdc++.h>
using namespace std;
template<class Item>
class MaxHeap {
private:
Item* data;
int count;
int capacity;
void shiftUp(int k) {
//data[k/2]为data[k]的父结点
while(data[k/2] < data[k] && k > 1) {
swap(data[k/2], data[k]);
k /= 2;
}
}
void shiftDown(int k) {
//当前结点有孩子时执行以下代码
while(2*k <= count) {
int j = 2*k;
if(j + 1 <= count && data[j+1] > data[j])
j++;
if<