数据结构(8) -- 堆
//MaxHeap.h #ifndef MAXHEAP_H_ #define MAXHEAP_H_ #define ElementType int #define MAXDATA 1000 class MaxHeap { private: ElementType *elem; int size; int capacity; public: MaxHeap(); //默认构造函数 MaxHeap(int MaxSize); //构造一个大小为MaxSize*ElementTye的堆 ~MaxHeap(); //释放elem bool IsFull(); //判断堆是否已满 bool IsEmpty(); //判断堆是是否为空 void Insert(ElementType item); //往插入元素 ElementType DeleteMax(); //删除堆中最大元素 void print(); //打印堆元素 }; #endif //MaxHeap.cpp #include "MaxHeap.h" #include <iostream> MaxHeap::MaxHeap() { int MaxSize = 100; elem = new ElementType[MaxSize + 1]; size = 0; capacity = MaxSize + 1; elem[0] = MAXDATA; } MaxHeap::MaxHeap(int MaxSize) { elem = new ElementType[MaxSize + 1]; size = 0; capacity = MaxSize + 1; elem[0] = MAXDATA; } MaxHeap::~MaxHeap() { delete[] elem; } bool MaxHeap::IsFull() { if (size >= capacity) return true; else return false; } bool MaxHeap::IsEmpty() { if (size == 0) return true; else return false; } void MaxHeap::Insert(ElementType item) { //判断堆是否已满 if (IsFull()) { std::cout << "最大堆已满" << std::endl; return; } int i = ++size; //将新元素放在堆最后,然后依次和父亲节点比较,换位置 for (; elem[i / 2] < item; i /= 2) elem[i] = elem[i / 2]; elem[i] = item; } ElementType MaxHeap::DeleteMax() { //从最大堆中取出键值为最大的元素,并删除一个节点 int parent, child; ElementType MaxItem, temp; if (IsEmpty()) { std::cout << "最大堆已为空" << std::endl; return -1; } MaxItem = elem[1]; //取出根节点的最大值 //用最大堆中最后一个元素从根节点开始从向上过滤下层节点 temp = elem[size--]; for (parent = 1; parent * 2 <= size; parent = child) { child = 2 * parent; if ((child != size) && elem[child] < elem[child + 1]) child++; if (temp >= elem[child]) break; else elem[parent] = elem[child]; } elem[parent] = temp; return MaxItem; return 0; } void MaxHeap::print() { for (int i = 1; i <= size; i++) std::cout << elem[i] << " "; } //////////////////////////////////////////////////////// //测试 #include <iostream> #include "MaxHeap.h" using namespace std; int main() { MaxHeap *h = new MaxHeap(100); //构造堆 for (int i = 0; i < 100; i++) h->Insert(i); h->print(); //打印堆 cout << endl; //得到堆排序的输出结果 for (int i = 0; i < 100; i++) cout << h->DeleteMax() << " "; cout << endl; system("pause"); return 0; }