STL中heap的用法

介紹

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);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章