您的位置:首页 > 编程语言 > C语言/C++

优先队列(堆)笔记 c++

2016-05-06 21:24 603 查看
当队列中某个对象优先级比其他对象更高时候,需要比其他对象先出队列而不管所在的位置时候,需要使用优先队列。

有如下的实现方法

- 插入在对尾,出队时候遍历整个队列

- 插入时即进行排序,出队时候固定在队首或者对尾

- 使用二叉查找树

- 使用二叉堆

还有D堆,是对二叉堆的扩充,不赘述了

堆是完全二叉树,使用数组就可以很好的实现。(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: