C++中堆的使用及自定义类型排序

简介

C++中堆(heap)是在vector的基础上实现的。具体地,是定义了一些方法在vector类型数据上进行操作,包括
- make_heap 建立堆(默认最大堆)
- push_heap 加入元素
- pop_heap 删除元素
- sort_heap 堆排序义的一些方法

代码示例

#include<iostream>  
#include<vector>  
#include<algorithm>  

using namespace std;  

/* 自定义数据类型:包含一个整数、一个浮点数 */
typedef struct DoubleIndex
{
    int                 id;             // index
    double              val;            // value
    DoubleIndex(){}
    DoubleIndex(int _id, double _val): id(_id), val(_val){}
    /* 切记定义运算符重载 */
    bool operator < (const DoubleIndex &b) const { return val < b.val; }
    bool operator > (const DoubleIndex &b) const { return val > b.val; }
} DoubleIndex;

/* 比较函数 */
bool CompareDoubleIndex(const DoubleIndex &a, const DoubleIndex &b){
    return a.val < b.val;
}

int main()  
{  
    vector<DoubleIndex> list;
    vector<DoubleIndex>::iterator iter;

    /// 初始vector列表
    list.push_back(DoubleIndex(1, 3.1));
    list.push_back(DoubleIndex(2, 1.1));
    list.push_back(DoubleIndex(3, 4.1));
    list.push_back(DoubleIndex(4, 2.1));
    list.push_back(DoubleIndex(5, 0.1));

    /// 建立堆,make_heap这一步将上面的列表构造成一个堆
    make_heap(list.begin(), list.end(), CompareDoubleIndex);
    for(iter=list.begin();iter!=list.end();++iter)  
        cout<<(*iter).id << ":" << (*iter).val<<endl;  
    cout<<endl;
    /* 初始堆
    3:4.1
    4:2.1
    1:3.1
    2:1.1
    5:0.1
    */

    /// 加入元素第一步:新元素压入vector列表
    list.push_back(DoubleIndex(6,10.1));
    for(iter=list.begin();iter!=list.end();++iter)  
        cout<<(*iter).id << ":" << (*iter).val<<endl;  
    cout<<endl; 
    /* 这是加入vector的效果,可以看到,新元素被放在了列表末尾
    3:4.1
    4:2.1
    1:3.1
    2:1.1
    5:0.1
    6:3.65  
    */
    // 加入元素第二步:新元素加入堆
    push_heap(list.begin(), list.end());
    for(iter=list.begin();iter!=list.end();++iter)  
        cout<<(*iter).id << ":" << (*iter).val<<endl;  
    cout<<endl; 
    /* 可以看到,新元素[6:3.65]更新了原先第二层右边的节点[1:3.1]
    3:4.1
    4:2.1
    6:3.65
    2:1.1
    5:0.1
    1:3.1
    */

    /// 堆排序
    sort_heap(list.begin(), list.end());
    for(iter=list.begin();iter!=list.end();++iter)  
        cout<<(*iter).id << ":" << (*iter).val<<endl;  
    cout<<endl;  
    /*
    5:0.1
    2:1.1
    4:2.1
    1:3.1
    6:3.65
    3:4.1
    */

    return 0;  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值