标签:
当队列中某个对象优先级比其他对象更高时候,需要比其他对象先出队列而不管所在的位置时候,需要使用优先队列。
有如下的实现方法
- 插入在对尾,出队时候遍历整个队列
- 插入时即进行排序,出队时候固定在队首或者对尾
- 使用二叉查找树
- 使用二叉堆
往往在最后的最重要
堆是完全二叉树,使用数组就可以很好的实现。(vector更好,不需要再扩容)
template <typename T>
class BinaryHeap
{
public:
explicit BinaryHeap(int capacity = 100);
explicit BinaryHeap(const vector<T> &items);
bool isEmpty() const;
//假设最小的出列,也可以调整最大的出列
const T & findMin() const;
void insert( const T & t);
void deleteMin();
void deleteMin ( T & t);
void makeEmpty();
private:
int currentSize;
vector<T> array;
void buildHeap();
void percolateDown(int hole);
};
/*新元素首先找到最后位置,保证是完全二叉树,当它小于它的父节点时候,交换位置,当大于
父节点时,插入新元素*/
template <typename T>
void BinaryHeap<T>::insert(const T &t)
{
int hole = ++currentSize;
for( ; hole > 1 && t < array[ hole / 2]; hole /= 2)
array[ hole ] = array[hole / 2];
array[hole] = t;
}
//删除堆中最小的元素,主要依靠percolateDown实现下滤
template <typename T>
void BinaryHeap<T>::deleteMin()
{
if( isEmpty() )
throw underflowExcption();
array[1] = array[currentSize--];
percolateDown(1);
}
//删除堆中最小的元素并获得元素,主要依靠percolateDown实现下滤
template <typename T>
void BinaryHeap<T>::deleteMin(T & t)
{
if (isEmpty())
throw underflowExcption();
t = array[1];
array[1] = array[currentSize--];
percolateDown(1);
}
//下滤函数
template <typename T>
void BinaryHeap<T>::percolateDown(int hole)
{
int child;
T t = array[hole];
for( ; hole * 2 < currentSize; hole = child)
{
child = hole * 2;
if (child != currentSize && array[child + 1] < array[child])
++child;
if (array[child] < tmp)
array[hole] = array[child];
else
break;
}
array[hole] = tmp;
}
标签:
原文地址:http://blog.csdn.net/u012851419/article/details/51334742