[STL]heap和priority_queue

一.heap算法

      在STL中,priority_queue(优先权队列)的底层机制是最大堆,所以有必要先来了解一下heap。heap采用彻底二叉树的结构,固然不是真正的binary tree,由于对于彻底二叉树,咱们一般用一个数组来表示。数组

      如下几个算法都是STL的泛型算法,包含在头文件algorithm里,priority_queue的push(),pop()都有直接调用它们。函数

1.push_heap算法spa

      首先,将新元素插入到底层vector的end()处。为了知足最大堆原理(每一个结点的值必须大于或等于其子结点的值),因而将新结点与其父亲结点比较,若是其值大于父亲结点,就交换父子结点,直到不须要交换或者它已经到达根结点为止。blog

2.pop_heap算法排序

      由于做为最大堆,根结点即为最大值。交换vector首尾(first和last)元素,并从新调整[first,last-1)部分,也就是将“新根结点”跟其较大子结点交换,并持续下放,知道叶子结点为止。注意,pop_heap以后,最大元素只是被放在底部容器的最尾端,并无被取走。若要取走,可用vector的pop_back()函数。队列

3.sort_heap算法源码

      持续对整个heap作pop_heap操做,每次将操做范围从后向前缩减一个元素,因而咱们获得一个递增序列。显然,排序后的heap不是一个合法的heap了。it

4.make_heap算法io

      这个算法用来将数组转化成一个heap。

 

二.priority_queue

      顾名思义,priority_queue是一个拥有权值观念的queue。因为这是一个queue,因此只容许在底端加入元素,并从顶端取出元素,除此以外没有其余存取元素的途径,因此priority_queue没有迭代器,不提供遍历功能。

      注意,priority_queue缺省状况下是以vector为底部容器,并非deque,而queue是以deque为底部容器。

 

三.堆排序

      了解以上内容后,最重要的是咱们能够本身写出一个堆排序算法,而不是简单的应用这些泛型算法。固然了,限于本人水平,确定与源码有天壤之别,只是一个简单的堆排序算法而已。

void AdjustDown(vector<int> &A,int index,int rindex)
{
	int len=A.size();
	int child=2*index+1; //左孩子下标
	int temp=A[index];
	while(child<=rindex)
	{
		if(child<rindex&&A[child]<A[child+1]) //若右孩子大于左孩子
			child++; //child指向右孩子
		if(temp>=A[child]) break; //父结点大于孩子结点,无需调整
		A[(child-1)/2]=A[child]; //不然父结点放较大孩子
		child=2*child+1; //child指向“空”结点左孩子
	}
	A[(child-1)/2]=temp; //空结点放须要调整(index)的值
}

void HeapSort(vector<int> &A)
{
	int i;
	int len=A.size();
	for(i=(len-2)/2;i>=0;i--) //make_heap
		AdjustDown(A,i,len-1);
	for(i=len-1;i>0;i--)
	{
		swap(A[0],A[i]); 
		AdjustDown(A,0,i-1); 
	}
}
相关文章
相关标签/搜索