c ++筛选堆

时间:2010-12-03 01:22:15

标签: c++ heap heapsort

我正在编写一个程序,要求我使用堆,除了我的排序方法,一切运行正常,显然非常重要!我不确定我的逻辑有什么问题,或者我错过了一些愚蠢的东西。但是看一眼新鲜的眼睛会很好。

该函数正在传递我的向量,当然是堆,根的位置,然后STL更少或更大作为谓词。

template<class T,class P>
void upheap(vector<T>& v, int start, P func) {
   T x = v[start];
   while (start > 1 && func(x, v[start/2])) {
      v[start] = v[start/2]; start /= 2;
   }
   v[start] = x;
}  

知道出了什么问题吗?

1 个答案:

答案 0 :(得分:2)

向量中的第一个元素是v [0]。你似乎认为它在v [1]。有这个原因吗?

如果根位于v [0],给定索引i处的节点,父节点位于int((i-1)/ 2)(尽管(i-1)&gt;&gt; 1可能更有效),孩子们在2i + 1,2i + 2。 E.g:

     0
   1   2
 3  4 5  6
78 9A BC DE

另一方面,如果根位于v [1],则父节点位于int(i / 2)(或i>&gt; 1),并且子节点位于2i,2i + 1。 E.g:

     1
   2   3
 4  5 6  7
89 AB CD EF

所以这可能是一个问题。

您检查 func(x,v [start / 2]) 是否为true。如果func是堆条件,您可能想检查是否为false ...

矢量是否足够大以包含v [start]?如果正在使用 upheap()将一个项目一次添加到堆中...并且向量的大小永远不会增加...(另外,你从v [1]开始,而不是v [0]。所以这是一个额外的元素。)

您是否曾尝试编写一个简单的脚手架(用于测试/调试但不是最终产品的一部分的代码)例程来打印堆,将其添加到您的循环中,并运行练习数据以查看事情发生的地方失衡