[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); 
	}
}
相關文章
相關標籤/搜索