堆的常用方法实现
#include<algorithm>
常用方法有4个:make_heap、sort_heap、pop_heap、push_heap
这4个函数的参数都一样,返回值都为void。
first 首元素地址
last 尾元素地址
cmp 比较函数(决定大堆还是小堆)
1 template <class T>
2 class MinHeap
3 {
4 private:
5 T *heapArray;
6 int CurrentSize;
7 int MaxSize;
8 void BuildHeap(); // 最小堆ADT定义
9 // 存放堆数据的数组 // 当前堆中元素数目
10 // 堆所能容纳的最大元素数目 // 建堆
11 public:
12 MinHeap(const int n); // 构造函数,n为最大元素数目
13 virtual ~MinHeap()
14 {
15 delete[] heapArray;
16 };
17 bool isLeaf(int pos) const;
18 int leftchild(int pos) const;
19 int rightchild(int pos) const;
20 int parent(int pos) const;
21 // 返回左孩子位置 // 返回右孩子位置 // 返回父结点位置
22 bool Remove(int pos, T &node); // 删除给定下标元素
23 bool Insert(const T &newNode); //向堆中插入新元素
24 T &RemoveMin();
25 // 从堆顶删除最小值
26 void SiftUp(int position); // 从position向上调整堆
27 void SiftDown(int left);
28 };
29 template <class T>
30 MinHeap<T>::MinHeap(const int n)
31 {
32 if (n <= 0)
33 return;
34 CurrentSize = 0;
35 MaxSize = n;
36 heapArray = new T[MaxSize];
37 BuildHeap();
38 }
39 template <class T>
40 //初始化堆容量为n //创建堆空间
41 //此处进行堆元素的赋值工作
42 //判断是否叶结点
43 bool MinHeap<T>::isLeaf(int pos) const
44 {
45 return (pos >= CurrentSize / 2) && (pos < CurrentSize);
46 }
47 template <class T>
48 int MinHeap<T>::leftchild(int pos) const
49 {
50 return 2 * pos + 1;
51 }
52 template <class T>
53 int MinHeap<T>::rightchild(int pos) const
54 {
55 return 2 * pos + 2;
56 }
57 template <class T>
58 //返回当前结点的父结点位置
59 int MinHeap<T>::parent(int pos) const
60 {
61 return (pos - 1) / 2;
62 //DIV //返回右孩子位置
63 }
64 template <class T>
65 void MinHeap<T>::SiftDown(int position)
66 {
67 int i = position;
68 int j = 2 * i + 1;
69 T temp = heapArray[i];
70 while (j < CurrentSize)
71 {
72 //标识父结点
73 //标识关键值较小的子结点 //保存父结点 //过筛
74 if ((j < CurrentSize - 1) && (heapArray[j] > heapArray[j +