Algorithm中Heap
2016-07-29 17:29
295 查看
介绍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。
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。
相关文章推荐
- 基于java中stack与heap的区别,java中的垃圾回收机制的相关介绍
- Grow heap (frag case) 堆内存过大的深入解析
- 深入Java虚拟机
- Converting HEAP to MyISAM in SHOW PROCESSLIST
- 内部代码kghasp1发现某一Heap大小为0
- JDK5.0中JVM堆模型、GC垃圾收集详细解析
- tomcat OutOfMemoryError: PermGen space
- 优先堆也可以用链表
- STL学习记录(十四):其它几种算法
- 堆和栈的区别(转载)
- java heap out of memory分析
- 二叉堆--C语言实现
- Android Studio的内存泄漏检测
- davlik heap out of memory
- 优先级队列之堆实现
- C/C++程序占用内存分析
- 可伸缩堆(heap)的面向对象的C实现
- 排序算法(2)-堆排序
- 初识JVM中堆栈的存储