#include "algostuff.hpp"//见http://www.cnblogs.com/qnbs1/articles/1709197.html

using namespace std;
int main()
{
 vector<int>coll;
 INSERT_ELEMENTS(coll,3,7);
 INSERT_ELEMENTS(coll,3,9);
 INSERT_ELEMENTS(coll,1,4);
 PRINT_ELEMENTS(coll,"on entry: ");

 make_heap(coll.begin(),coll.end());
 PRINT_ELEMENTS(coll,"after make_heap(): ");

 pop_heap(coll.begin(),coll.end());
 coll.pop_back();
 PRINT_ELEMENTS(coll,"after pop_heap(): ");

 coll.push_back(17);
 push_heap(coll.begin(),coll.end());
 PRINT_ELEMENTS(coll,"after push_heap(): ");

 sort_heap(coll.begin(),coll.end());
 PRINT_ELEMENTS(coll,"after sort_heap(): ");
 return 0;

}
/*
输出:on entry: 3 4 5 6 7 3 4 5 6 7 8 9 1 2 3 4
after make_heap(): 9 8 5 6 7 3 4 5 6 7 4 3 1 2 3 4
after pop_heap(): 8 7 5 6 7 3 4 5 6 4 4 3 1 2 3
after push_heap(): 17 8 5 7 7 3 4 6 6 4 4 3 1 2 3 5
after sort_heap(): 1 2 3 3 3 4 4 4 5 5 6 6 7 7 8 17
Press any key to continue
*/

记:一直没看懂堆,查了不少资料,自已整理了一下,今天终于明白怎么回事了,记下来希望能帮到大家~

主要是make_heap()这个函数很难理解,它到底是怎么构建堆的呢?网上搜索答案的时候没找到讲得很清楚的,stl里面也只是给出这个函数,具体实现也看不到,大部分人说去看数据结构书,我也去翻了一下,严蔚敏老师那本,还是不明白(难道RP有问题?),查msdn也只是大概讲了一下这个函数是建堆用的,具体怎么建还是没有讲~

先把输入序列3 4 5 6 7 3 4 5 6 7 8 9 1 2 3 4按照完全二叉树的形式写下来(下一步就是按照堆的存放性质进行处理)~然后你可以想想,反正是要构造大顶堆,那么堆的第一个元素必为最大的,所以从9开始,因为大顶堆的性质是某个结点的孩子值总要比它小,所以9必须上移,而且必须移动到最上面作为这个堆的根,往上移的过程中,每经过一个结点就与它的位置交换,然后假设将最大的9去掉(即不管它),用次大的数(这里为8)再按照这个原则往上移,直到8处于它适合的位置,其他元素依此类推,左边的满足堆的性质后,再从右边选出最大的依照这个原则进行移动,直到右边也满足堆的性质即完成。(本想截图说明的,不太方便,弄起来也麻烦,先空着吧,以后有空再整理~)

下面的push_heap()函数也一样,压入的新元素加进去,也是先把所有的元素按照完全二叉树写下来,再按照相同的原则操作即可!

posted on 2010-04-13 14:18  蓝牙  阅读(1508)  评论(0编辑  收藏  举报