堆,堆“正确”

时间:2012-03-06 00:47:00

标签: c++ heapsort

我的问题是堆是否可以“正确”。我有一个任务要求我进行堆排序,但首先使用现有数组构建堆。如果我查看评分机代码,它会告诉我有一个确切的答案。 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));
    }

2 个答案:

答案 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也可以切换位置。如果堆的最小和最大深度相等,那么任何节点的子树都可以切换位置。

如果您的评分者是自动的,那么它应该以检查堆属性的方式实现,而不是确切的数组。如果你的分级师是老师,你应该在他们面前正式证明你的堆的正确性,这是微不足道的。

相关问题