介紹
STL的堆操作在頭文件<algorithm>中,堆是以數組或者vector實現的完全二叉樹結構(如果一個二叉樹深度爲h, 除了最後一層之外,其他層都達到最大個數,最後一層滿足從左到右的順序沒有空隙)
- 大頂堆:所有父節點>=子節點(數組中:array[i] >= array[2i+1] && array[i]>=array[2i+2])
- 小頂堆:所有父節點<=子節點(數組中:array[i] <= array[2i+1] && array[i]>=array[2i+2])
heap的四種操作
make_heap()
建立堆,要麼大頂堆(less<T>()),要麼小頂堆(greater<T>())
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void print(int a)
{
cout << a << " " ;
}
void Print(const vector<int>& array)
{
for_each(array.begin(), array.end(), print);
cout << endl;
}
int main(void)
{
vector<int> array;
for(int i=0; i<9; i++)
{
array.push_back(i);
}
make_heap(array.begin(), array.end(),greater<int>()); // 小頂堆: 0 1 2 3 4 5 6 7 8
// make_heap(array.begin(), array.end(),less<int>()); //大頂堆: 8 7 6 3 4 5 2 1 0
// make_heap(array.begin(), array.end()); //不提供仿函數,默認大頂堆: 8 7 6 3 4 5 2 1 0
Print(array);
return 0;
}
push_heap()
添加一個元素在末尾,重現調整堆,需要注意的是: 必須是數組本來已經是一個堆的前提下,且push_heap的第三個參數需要和原來的堆相同。
vector<int> array;
for(int i=0; i<9; i++)
{
array.push_back(i);
}
make_heap(array.begin(), array.end(), less<int>());
Print(array);
array.push_back(100); //首先數組push_back插入元素,
push_heap(array.begin(), array.end(),less<int>()); //然後再調用push_heap
Print(array);
pop_heap()
將堆頂的元素和數組末尾的元素交換,end-1(算法將不包括數組最後一個元素),再從新調整堆,結束之後,數組最後一個元素還在,大部分情況需要再手動 push_back()
vector<int> array;
for(int i=0; i<9; i++)
{
array.push_back(i);
}
make_heap(array.begin(), array.end(), less<int>());
Print(array);
array.push_back(100);
push_heap(array.begin(), array.end(),less<int>()); // 100 8 6 3 7 5 2 1 0 4
Print(array);
pop_heap(array.begin(), array.end(), less<int>());// 8 7 6 3 4 5 2 1 0 100
array.pop_back() // 8 7 6 3 4 5 2 1 0
Print(array);
sort_heap()
將一個原有的堆進行堆排序,得到一個排序的數組,第三個參數必須和原有的堆一樣的(原來的是大頂堆,參數是less<T>(),否則相反),pop_heap()一次將最大放到最後,再重新調整成新的堆;其實不斷pop_heap()(次數:數組長度)的過程。
vector<int> array;
for(int i=0; i<9; i++)
{
array.push_back(i);
}
make_heap(array.begin(), array.end(), less<int>()); //8 7 6 3 4 5 2 1 0
Print(array);
array.push_back(100);
push_heap(array.begin(), array.end(),less<int>()); //100 8 6 3 7 5 2 1 0 4
Print(array);
pop_heap(array.begin(), array.end(), less<int>()); // 8 7 6 3 4 5 2 1 0 100
Print(array);
array.pop_back(); // 8 7 6 3 4 5 2 1 0
sort_heap(array.begin(), array.end(), less<int>()); // 0 1 2 3 4 5 6 7 8
Print(array);