[算法浅析] Algorithm中Heap用法小结


/* 介绍algorithm头文件中根的相关函数
    make_heap(首位置, 尾位置+1, 可选的cmp函数); -> 构造堆
    push_heap(首位置, 尾位置+1, 可选的cmp函数); -> 添加元素到堆中
    pop_heap(首位置, 尾位置+1, 可选的cmp函数);  -> 从堆中移出元素
    sort_heap(首位置, 尾位置+1, 可选的cmp函数); -> 整个堆进行排序
*/

#include<algorithm>
#include<cstdio>
using namespace std;

bool inc_cmp(int a,int b){ return a > b; }
// 可以理解为:左a右b,当a>b的时候,双方交换位置,
// 所以上式这个cmp意为从小到大(排序)。

bool des_cmp(int a, int b){ return a < b; }

int num[10]={3, 1, 2, 5, 6, 4};

int main()
{    
    make_heap(num, num+6);//构造一个堆,默认是大根堆。
    // 上式等价于make_heap(&num[0], &num[6]);可以看到,区间是[0, 7),
    // 即参数中的末尾是真真实末尾的后一个位置。
    // 可以修改为make_heap(num, num+6, inc_cmp); 此时为小根堆。
    
    // 插入一个元素到先前创建的堆中,插进来的数将调整到合适的位置。
    num[6] = 5;
    push_heap(num, num+7);
    
    // pop_heap将堆顶数据移动到末尾位置,然后将剩余数据重新构造堆。
    // 其中一个易于理解的例子就是,不断将大根堆堆顶移到末尾,
    // 以此模拟从小到大排序。
    
    /* ---------- */
    printf("before: ");
    for(int i = 0; i < 7; i++)
        printf("%d ", num[i]);
    printf("\n");
    
    for(int i = 7; i >= 1; i--) // 共7个数,交换到最后第二个数为止。
    {
        pop_heap(num, num+i);
    }
    
    printf("after : ");
    for(int i = 0; i < 7; i++)
        printf("%d ", num[i]);
    printf("\n");
    /* ---------- */
    
    //sort_heap,堆排序,因为前面都pop_heap掉了,所以得重新make_heap
    make_heap(num, num + 6);
    sort_heap(num, num+6, des_cmp);
    for(int i = 0; i < 7; i++)
        printf("%d ", num[i]);
    printf("\n");
    return 0;
}



/*
总结:
想要进行堆操作,前提必须是“已构建了堆”。
如果在使用时碰到数据混乱,那么很有可能就是没有make_heap。
需要注意的是make_heap后进行pop_heap操作,那么这个根比原来的"影响范围"就小了,
假设进行上述的"排序"操作,那么这些数据就不再是堆。
想要另行操作只能重新make_heap。

*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值