#include <cstdlib>
#include <iostream>
using namespace std;
template<typename T>
class Heap//最大堆
{
private:
int currentSize;
int maxSize;
T *heapArray;
public:
Heap(int size = 10)
{
currentSize = 0;
maxSize = size; //初始化堆容量
heapArray = new T[maxSize]; //创建堆空间
};
~Heap()
{
if(heapArray)
delete[] heapArray;
};
int getCurrentSize()
{
return currentSize;
};
int leftchild(int pos)
{
return (2 * pos + 1);
};
int rightchild(int pos)
{
return(2 * pos + 2);
};
int parent(int pos)
{
return (pos - 1) / 2;
};
//调整
void shiftDown(int pos) //向下调整以pos为根的子树为一个堆
{
int largest = leftchild(pos);
while(largest < currentSize)
{
//寻找较大的子节点
if(largest < currentSize-1 && heapArray[largest] < heapArray[largest+1])
{
largest++;
}
if(heapArray[pos] < heapArray[largest]) //交换父节点和较大的子节点
{
T tmp = heapArray[pos];
heapArray[pos] = heapArray[largest];
heapArray[largest] = tmp;
pos = largest; //继续向下
largest = leftchild(pos);
}
else //已经是最大堆了
{
return;
}
}
};
void shiftUp(int pos) //向上调整为堆
{
int par = parent(pos);
T tmp = heapArray[pos]; //记录上移节点
while(pos && tmp > heapArray[par])
{
heapArray[pos] = heapArray[par];
pos = par;
par = parent(pos);
}
heapArray[pos] = tmp;
};
T & max()//因为是返回引用,要求将删除的元素放到堆尾的下一个位置
{
if(currentSize == 0) //空堆
{
cerr<<"The heap is Empty!"<<endl;
exit(1); //无法返回确切的T值,强制退出
}
T tmp = heapArray[0];
heapArray[0] = heapArray[--currentSize];
heapArray[currentSize] = tmp;
if(currentSize > 1) //堆中只有一个元素就不需调整了
{
shiftDown(0);
}
return heapArray[currentSize];
};
bool insert(const T & newNode)
{
if(currentSize == maxSize) //堆满
{
cerr<<"The heap is full!"<<endl;
return false;
}
heapArray[currentSize] = newNode;
shiftUp(currentSize); //向上调整
currentSize++;
return true;
};
bool remove(int pos, T &node)
{
if(pos < 0 || pos >= currentSize)
{
cerr<<"pos is error"<<endl;
return false;
}
node = heapArray[pos];//返回值
heapArray[pos] = heapArray[--currentSize]; //最后元素填补删除的元素
//当前元素大于父亲节点,向上调
if(heapArray[pos] > heapArray[parent(pos)])
{
shiftUp(pos);
}
else
{
shiftDown(pos);
}
return true;
};
int find(const T &key)
{
int pos = 0;
if(currentSize < 1 || key > heapArray[pos])
{
return -1;
}
while(pos < currentSize)
{
if(key == heapArray[pos])
{
return pos;
}
pos++;
}
return -1;
};
void printHeap()
{
for(int i = 0;i < currentSize;i++)
{
cout<<heapArray[i]<<" ";
}
cout<<endl;
};
};
int main(int argc, char *argv[])
{
Heap<int> *H = new Heap<int>();
H->insert(6);
H->printHeap();
H->insert(5);
H->insert(3);
H->insert(4);
H->insert(3);
H->insert(2);
H->insert(1);
H->printHeap();
H->insert(7);
H->printHeap();
system("PAUSE");
return EXIT_SUCCESS;
}