我的问题是堆是否可以“正确”。我有一个任务要求我进行堆排序,但首先使用现有数组构建堆。如果我查看评分机代码,它会告诉我有一个确切的答案。 T实现堆构建的方式我得到了一个稍微不同的答案,但据我所知,根据定义,堆是正确的。
“正确”的数组顺序是
{15, 12, 6, 11, 10, 2, 3, 1, 8}
但我得到
{15, 12, 10, 11, 2, 6, 3, 1, 8}
原始载体是
{2, 8, 6, 1, 10, 15, 3, 12, 11}
void HeapSort::buildHeap(std::vector<CountedInteger>& vector)
{
std::vector<CountedInteger> temp;
for(int i = 0; i < vector.size(); i++)
{
temp.push_back(vector[i]);
fixDown(temp, i);
}
vector.swap(temp);
for(int i = 0; i < vector.size(); i++)
{
std::cout<< vector[i]<<std::endl;
}
}
void HeapSort::sortHeap(std::vector<CountedInteger>& vector)
{
}
inline unsigned int HeapSort::p(int i)
{
return ((i-1)/2);
}
void HeapSort::fixDown(std::vector<CountedInteger>& vector, int node)
{
if(p(node) == node) return;
if(vector[node] > vector[p(node)])
{
CountedInteger temp = vector[node];
vector[node] = vector[p(node)];
vector[p(node)] = temp;
fixDown(vector, p(node));
}
答案 0 :(得分:4)
有许多方法可以从输入创建最大堆。举个例子:
15, 12, 10, 11, 2, 6, 3, 1 8 15 12 10 11 2 6 3 1 8
它满足堆标准,因此它是一个正确的最大堆。另一个例子是:
15, 12, 6, 11, 10, 2, 3, 1, 8 15 12 6 11 10 2 3 1 8
这也符合堆标准,因此它也是一个正确的最大堆。
最大堆标准:每个节点都大于其任何子节点。
一个更简单的例子是1, 2, 3
,其中有两个堆,
3 3 / \ / \ 1 2 2 1
答案 1 :(得分:0)
从数组中创建堆肯定是一个可能导致多个不同但有效堆的操作。
如果你看一下trivial example,很明显一个节点的至少一些子树可以切换位置。在给定的示例中,2和7可以切换位置。 25和1也可以切换位置。如果堆的最小和最大深度相等,那么任何节点的子树都可以切换位置。
如果您的评分者是自动的,那么它应该以检查堆属性的方式实现,而不是确切的数组。如果你的分级师是老师,你应该在他们面前正式证明你的堆的正确性,这是微不足道的。