作者东大大二信科专业学生
本文为课后拓展作业
自己调试+运行无任何错误
希望得到指正~
#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; }
运行结果如下图:
如有错误希望指出~
虚心求教~
谢谢大家~



