码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-05-07 11:17:51      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:

当队列中某个对象优先级比其他对象更高时候,需要比其他对象先出队列而不管所在的位置时候,需要使用优先队列。
有如下的实现方法
- 插入在对尾,出队时候遍历整个队列
- 插入时即进行排序,出队时候固定在队首或者对尾
- 使用二叉查找树
- 使用二叉堆

往往在最后的最重要

堆是完全二叉树,使用数组就可以很好的实现。(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;
}

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

标签:

原文地址:http://blog.csdn.net/u012851419/article/details/51334742

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!