STL中的heap算法

  就排序而言,heap是一种特别的元素组织方式,应用于heap排序法。Heap可以被视为一个以序列式集合实现而成的二叉树。具有两大性质:

  1. 第一个元素总是最大
  2. 总是能够在对数时间内增加或者移除一个元素。

======
  Heap是实现优先级队列的一个理想结构,因此heap算法也被priority_queue容器使用。为了处理heap,STL提供了四个算法:

  1. make_heap():将某区间内的元素转化为heap
  2. push_heap():对heap增加一个元素
  3. pop_heap():对heap取出下一个元素
  4. sort_heap():将heap转化为一个已排序序列。

同样的,可以给上述函数传入一个二元的谓词作为排序准则。默认的排序准则是operator<。

void make_heap(RandomAccessIterator beg,RandomAccessIterator end/*,BinaryPredicate op*/)
  • 两种形式都将[beg,end)区间内的元素转化为heap
  • 复杂度:线性,至多执行3*n次比较
void push_heap(RandomAccessIterator beg,RandomAccessIterator end/*,BinaryPredicate op*/)
  • 将end之前的最后一个元素加入原本就是heap的[beg,end-1)区间内,使整个[beg,end)区间成为一个heap
  • 调用者必须保证,进入函数时,[beg,end-1)区间内的元素(在相同的排序准则下)原本便已形成一个heap,而新元素紧随其后
  • 复杂度:对数
void pop_heap(RandomAccessIterator beg,RandomAccessIterator end/*,BinaryPredicate op*/)
  • 将heap[beg,end)内的最高元素(即第一个元素)移到最后位置,并将[beg,end-1)内的元素组织起来,从新组成heap
  • 调用者必须保证,进入函数时,[beg,end)区间内的元素(在相同的排序准则下)原本便已形成一个heap
  • 复杂度:对数
void sort_heap(RandomAccessIterator beg,RandomAccessIterator end/*,BinaryPredicate op*/)
  • 将heap[beg,end)转换为一个已排序序列
  • 此算法一旦结束,该区间就不再是一个heap
  • 调用者必须保证,进入函数时,[beg,end)区间内的元素(在相同的排序准则下)原本便已形成一个heap
int main()
{
    vector coll;
    insertElements(coll, 3, 7);
    insertElements(coll, 5, 9);
    insertElements(coll, 1, 4);

    printElements(coll,"on entry: ");

    make_heap(coll.begin(), coll.end());

    printElements(coll,"after make_heap(): ");

    pop_heap(coll.begin(), coll.end());
    coll.pop_back();

    printElements(coll, "after pop_heap(): ");

    coll.push_back(17);
    push_heap(coll.begin(), coll.end());

    printElements(coll, "after push_heap(): ");

    sort_heap(coll.begin(), coll.end());

    printElements(coll, "after sort_heap(): ");

    return 0;




}

STL中的heap算法_第1张图片

调用make_heap()之后,元素被排序为heap:

9 8 6 7 7 5 5 3 6 4 1 2 3 4

如果把这些元素转换为二叉树
STL中的heap算法_第2张图片
可以看到每个元素都小于或者等于其父亲结点。

你可能感兴趣的:(C++,STL,Heap)