我正在编写一个程序,要求我使用堆,除了我的排序方法,一切运行正常,显然非常重要!我不确定我的逻辑有什么问题,或者我错过了一些愚蠢的东西。但是看一眼新鲜的眼睛会很好。
该函数正在传递我的向量,当然是堆,根的位置,然后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;
}
知道出了什么问题吗?
答案 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]。所以这是一个额外的元素。)
您是否曾尝试编写一个简单的脚手架(用于测试/调试但不是最终产品的一部分的代码)例程来打印堆,将其添加到您的循环中,并运行练习数据以查看事情发生的地方失衡