C++标准库---heap算法

heap算法
就排序而言,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;
}

运行结果:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值