heap算法
就排序而言,heap是一种特别的元素组织方式,应用于heap排序法。heap可被视为一个序列式群集实作而成的二叉树,具有两大性质:
STL提供四种算法:
1.make_heap() 将区间内的元素转换为heap
2.push_heap() 对着heap增加一个元素
3.pop_heap() 对着heap取出下一个元素
4.sort_heap() 将heap转化为一个已序序列
(1)make_heap():
make_heap(beg,end)
make_heap(beg,end,op)
两种形式都将区间[beg,end)内的元素转换为heap;
op是一个可有可无的二元判断,被视为排序准则:
op(elem1,elem2)
只有在多于一个元素的情况下,才有必要使用这些函数来处理heap,如果只有单一元素,那么它自动就形成一个heap;
复杂度:线性;
(2)push_heap():
push_heap(beg,end)
push_heap(beg,end,op)
两种形式都将end之前的最后一个元素加入原本就是个heap的[beg,end-1)区间内,使整个区间[beg,end)成为一个heap;
(3)pop_heap():
pop_heap(beg,end)
pop_heap(beg,end,op)
以上两种形式都将heap[beg,end)内的最高元素,也就是第一个元素,移到最后位置,并将剩余区间[beg,end-1)内的元素组着起来,成为一个新的heap;
(4)sort_heap():
sort_heap(beg,end)
sort_heap(beg,end,op)
以上两种形式都可以将heap[beg,end)转换为一个已序序列;
运行结果:
就排序而言,heap是一种特别的元素组织方式,应用于heap排序法。heap可被视为一个序列式群集实作而成的二叉树,具有两大性质:
1.第一个元素总是最大;
2.总是能够在对数时间内增加或移除一个元素。STL提供四种算法:
1.make_heap() 将区间内的元素转换为heap
2.push_heap() 对着heap增加一个元素
3.pop_heap() 对着heap取出下一个元素
4.sort_heap() 将heap转化为一个已序序列
(1)make_heap():
make_heap(beg,end)
make_heap(beg,end,op)
两种形式都将区间[beg,end)内的元素转换为heap;
op是一个可有可无的二元判断,被视为排序准则:
op(elem1,elem2)
只有在多于一个元素的情况下,才有必要使用这些函数来处理heap,如果只有单一元素,那么它自动就形成一个heap;
复杂度:线性;
(2)push_heap():
push_heap(beg,end)
push_heap(beg,end,op)
两种形式都将end之前的最后一个元素加入原本就是个heap的[beg,end-1)区间内,使整个区间[beg,end)成为一个heap;
op是一个可有可无的二元判断式,被视为排序准则:
op(elem1,elem2)调用者必须保证,进入函数时,区间[beg,end-1)内的元素原本便已形成一个heap(在相同的排序准则下),而新元素紧跟其后;
复杂度:对数(3)pop_heap():
pop_heap(beg,end)
pop_heap(beg,end,op)
以上两种形式都将heap[beg,end)内的最高元素,也就是第一个元素,移到最后位置,并将剩余区间[beg,end-1)内的元素组着起来,成为一个新的heap;
op是个可有可无的二元判断,被当作排序准则:
op(elem1,elem2)调用者必须保证,进入函数时,区间[beg,end)内的元素原本便已形成一个heap(在相同的排序准则下);
复杂度:对数;(4)sort_heap():
sort_heap(beg,end)
sort_heap(beg,end,op)
以上两种形式都可以将heap[beg,end)转换为一个已序序列;
op是个可有可无的二元判断式,被视为排序准则:
op(elem1,elem2)注意,此算法一旦结束,该区间就不再是heap了;
调用者必须保证,进入函数时,区间[beg,end)内的元素原本便已形成一个heap(在相同的排序准则下);
复杂度:nlogn
代码示例:
//haep
#include"fuzhu.h"
using namespace std;
int main()
{
vector<int> coll;
INSERT_ELEMENTS(coll,3,7);
INSERT_ELEMENTS(coll,5,9);
INSERT_ELEMENTS(coll,1,4);
PRINT_ELEMENTS(coll,"on entry: \n");
make_heap(coll.begin(),coll.end());
PRINT_ELEMENTS(coll,"after make_heap(): \n");
pop_heap(coll.begin(),coll.end());
coll.pop_back();
PRINT_ELEMENTS(coll,"after pop_heap(): \n");
coll.push_back(17);
push_heap(coll.begin(),coll.end());
PRINT_ELEMENTS(coll,"after push_heap(): \n");
sort_heap(coll.begin(),coll.end());
PRINT_ELEMENTS(coll,"after sort_heap(): \n");
system("pause");
return 0;
}
运行结果: