//声明文件
class CPriorityQueueByMaxHeap{ private: int* pArr; int nHeapSize; private: void MaxHeapify(int root); public: CPriorityQueueByMaxHeap(); CPriorityQueueByMaxHeap(int* arr, int len); ~CPriorityQueueByMaxHeap(); void AllElements(); int DeQueue(); void IncreaseKey(int i, int key); void EnQueue(int key); };
//实现文件
CPriorityQueueByMaxHeap::CPriorityQueueByMaxHeap() { pArr = new int[14]; pArr[0] = 13; for (int i = 1; i < 14; i++) pArr[i] = 0; nHeapSize = 0; } CPriorityQueueByMaxHeap::CPriorityQueueByMaxHeap(int* arr, int len) { pArr = NULL; nHeapSize = 0; if (arr != NULL && len != 0){ pArr = new int[len + 1 + 3]; pArr[0] = len + 3; for (int i = 0; i < len; i++) pArr[i + 1] = arr[i]; nHeapSize = len; for (int i = nHeapSize / 2; i >= 1; i--) MaxHeapify(i); } } CPriorityQueueByMaxHeap::~CPriorityQueueByMaxHeap() { if (pArr != NULL) delete pArr; } ////////////////////////////////////////////////////////////////////////////////// void CPriorityQueueByMaxHeap::IncreaseKey(int i, int key) { if (key < pArr[i]){ cout << "new key is smaller than current key !" << endl; return; } pArr[i] = key; while (i > 1 && pArr[i / 2] < pArr[i]){ int tmp = pArr[i / 2]; pArr[i / 2] = pArr[i]; pArr[i] = tmp; i = i / 2; } } void CPriorityQueueByMaxHeap::MaxHeapify(int root) { int left = root * 2; int right = root * 2 + 1; int largest = root; if (left <= nHeapSize && pArr[left] > pArr[root]) largest = left; if (right <= nHeapSize && pArr[right] > pArr[largest]) largest = right; if (largest != root){//root比left和right的值都小,甚至比叶子结点的值还小 int tmp = pArr[root]; pArr[root] = pArr[largest]; pArr[largest] = tmp; MaxHeapify(largest); } } void CPriorityQueueByMaxHeap::AllElements() { for (int i = 1; i <= nHeapSize; i++){ cout << setw(3) << pArr[i]; } cout << "(" << nHeapSize << "/" << pArr[0] << ")" << endl; } int CPriorityQueueByMaxHeap::DeQueue() { if (nHeapSize < 1){ cout << "UnderFlow !" << endl; return 0x80000000; } int nMax = pArr[1]; pArr[1] = pArr[nHeapSize]; nHeapSize--; MaxHeapify(1); return nMax; } void CPriorityQueueByMaxHeap::EnQueue(int key) { if (nHeapSize >= pArr[0]){ cout << "OverFlow !" << endl; return; } nHeapSize++; pArr[nHeapSize] = 0x80000000; IncreaseKey(nHeapSize, key); }
//测试客户端
//通过最大堆实现的优先队列 void PriorityQueueByMaxHeapTest1() { int Array[] = {16, 14, 10, 8, 7, 9, 3, 2, 4, 1 }; int Length = sizeof(Array) / sizeof(int); cout << "BulidHeap : " << endl; CPriorityQueueByMaxHeap PriQue(Array, Length); PriQue.AllElements(); cout << "IncreateKey : " << endl; PriQue.IncreaseKey(9, 15); PriQue.AllElements(); int key = 0x80000000; key = PriQue.DeQueue(); cout << "DeQueue : " << key << endl; PriQue.AllElements(); for (int i = 0; i < 5; i++){ key = 16 + i; PriQue.EnQueue(key); cout << "EnQueue : " << key << endl; PriQue.AllElements(); } for (int i = 0; i < 15; i++){ key = PriQue.DeQueue(); cout << "DeQueue : " << key << endl; PriQue.AllElements(); } } void PriorityQueueByMaxHeapTest2() { int Array[] = { 16, 14, 10, 8, 7, 9, 3, 2, 4, 1 }; int Length = sizeof(Array) / sizeof(int); cout << "EnQueue>>>>>>>>>>>>>>>>>>>>>>>>>." << endl; CPriorityQueueByMaxHeap PriQue; for (int i = 0; i < Length; i++){ PriQue.EnQueue(Array[i]); PriQue.AllElements(); } for (int i = 0; i < 5; i++){ PriQue.EnQueue(i*10); PriQue.AllElements(); } cout << "DnQueue>>>>>>>>>>>>>>>>>>>>>>>>>." << endl; for (int i = 0; i < 15; i++){ PriQue.DeQueue(); PriQue.AllElements(); } }