STL 中堆heap

例子

less<int>() 指下一层比上一层小

大堆

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std; 

int main() {
    int ia[9] = {0, 1, 2, 3, 4, 8, 9, 3, 5};
    vector<int> ivec(ia, ia+9);

    // 堆初始化,默认大堆
    // 下面等价于make_heap(&ivec[0], &ivec[9])
    make_heap(ivec.begin(), ivec.end());
    // 9 5 8 3 4 0 2 3 1
    for(int i=0;i!=ivec.size();i++)
        cout<<ivec[i]<<" ";
    cout<<endl;

    // 插入元素
    ivec.push_back(7);
    // 下面等价于push_heap(&ivec[0], &ivec[10]),10为新vector的长度
    push_heap(ivec.begin(), ivec.end());

    for(int i=0;i!=ivec.size();i++)
        cout<<ivec[i]<<" ";
    cout<<endl;

    // 弹出堆顶,大堆->最大值
    int max = ivec[0]; // 9
    pop_heap(ivec.begin(), ivec.end());
    ivec.pop_back();
    // 8 7 4 3 5 0 2 3 1
    for(int i=0;i!=ivec.size();i++)
        cout<<ivec[i]<<" ";
    cout<<endl;

    //堆排序,默认从小到大
    sort_heap(ivec.begin(), ivec.end());
    //0 1 2 3 3 4 5 7 8 9
    for(int i=0;i!=ivec.size();i++)
        cout<<ivec[i]<<" ";
    cout<<endl;
    sort_heap(ivec.begin(), ivec.end(), 
}

小堆

greater<int>() 指下一层比上一层大

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std; 

int main() {
    int ia[9] = {0, 1, 2, 3, 4, 8, 9, 3, 5};
    vector<int> ivec(ia, ia+9);

    make_heap(ivec.begin(), ivec.end(), greater<int>());
    // 0 1 2 3 4 8 9 3 5
    for(int i=0;i!=ivec.size();i++)
        cout<<ivec[i]<<" ";
    cout<<endl;

    ivec.push_back(7);
    push_heap(ivec.begin(), ivec.end(), greater<int>());
    0 1 2 3 4 8 9 3 5 7
    for(int i=0;i!=ivec.size();i++)
        cout<<ivec[i]<<" ";
    cout<<endl;

    int min = ivec[0]; // 0
    pop_heap(ivec.begin(), ivec.end(), greater<int>()); 
    ivec.pop_back();
    // 1 3 2 3 4 8 9 7 5
    for(int i=0;i!=ivec.size();i++)
        cout<<ivec[i]<<" ";
    cout<<endl;

    sort_heap(ivec.begin(), ivec.end(), greater<int>());
    // 9 8 7 5 4 3 3 2 1
    for(int i=0;i!=ivec.size();i++)
        cout<<ivec[i]<<" ";
    cout<<endl;


}

猜你喜欢

转载自blog.csdn.net/jason_cuijiahui/article/details/81584787