用数组构建最小堆
直接给出代码如下
#include <iostream> #include <stdlib.h> #include <stdio.h> #include <memory.h> using namespace std; class minHeap { private: int maxSize;//heap中存放元素的最大数量 int index;//有效数据游标 int *heapArray; public: minHeap(int size); virtual ~minHeap(); int insert(int val); int pop(int *res); void printHeap(); }; void minHeap::printHeap() { int i = 0; cout<<"print mini heap:"<<endl; for(i=0; i<=this->index; i++) { cout<<this->heapArray[i]<<" "; } cout<<endl; return; } minHeap::minHeap(int size) { if(size <= 0) { this->heapArray = NULL; return; } this->heapArray = (int*)malloc(sizeof(int)*size); if(NULL == this->heapArray) { cout<<"malloc heap array failed"<<endl; } this->maxSize = size; this->index = -1; memset(this->heapArray, 0, sizeof(int)*size); } int minHeap::insert(int val) { int x = 0; int i = this->index; int j = 0; //堆已经放满了 //暂时不支持heap扩展 if(i >= this->maxSize -1) { return -1; } i++; while(i > 0) { j = (i-1)/2;//parent if(val >= this->heapArray[j]) { break; } this->heapArray[i] = this->heapArray[j]; i = j; } this->heapArray[i] = val; this->index++; return 0; } int minHeap::pop(int *res) { int val = 0; int i = 0; int j = 0; if(this->index < 0 || this->heapArray == NULL) { cout << "the heap is empty." <<endl; return -1; } //返回堆顶不元素 *res = this->heapArray[0]; //取最后一个元素 val = this->heapArray[this->index]; i = 0; j = 2*i+1; //从根节点开始调整 while(j <= this->index) { if(j<this->index && this->heapArray[j] > this->heapArray[j+1]) { j++; } if(val < this->heapArray[j]) { break; } this->heapArray[i] = this->heapArray[j]; i = j; j = 2*i+1; } this->heapArray[i] = val; this->index--; return 0; } minHeap::~minHeap() { free(this->heapArray); this->maxSize = 0; this->index = -1; } int main(int argc, char **argv) { minHeap *pHeap = new minHeap(10); int i = 0; int res = 0; for(i=0; i<10; i++) { pHeap->insert(10-i); } pHeap->printHeap(); cout<<"pop start"<<endl; pHeap->pop(&res); cout << res <<endl; pHeap->pop(&res); cout << res <<endl; pHeap->pop(&res); cout << res <<endl; cout<<"pop end"<<endl; pHeap->printHeap(); delete pHeap; return 0; }