我做了一个堆。我很好奇我的删除函数是否有什么微妙的问题:
尽管我们的输出完全不同,但我似乎持有最大堆原则,即将所有节点左对齐,并使所有节点父节点 > 子节点(在我尝试的每种情况下)。我尝试从头开始编写算法,所以可能我做了一些非常奇怪和错误的事情(如果它的时间复杂度 > O(lg n),我才会考虑将其视为“错误”,因为删除操作是用于堆的)。我的删除方式有什么特别的“错误”吗?谢谢。 http://ideone.com/PPh4eQ
int Heap::remove() {
if (n == 0)
exit(1);
int temp = arr[0];
arr[0] = arr[--n];
heapDown(0);
arr[n] = 0;
return temp;
}
void Heap::heapDown(int i)
{
int l = left(i);
int r = right(i);
// comparing parent to left/right child
// each has an inner if to handle if the first swap causes a second swap
// ie 1 -> 3 -> 5
// 3 5 1 5 1 3
if (l < n && arr[i] < arr[l])
{
swap(arr[i], arr[l]);
heapDown(l);
if (r < n && arr[i] < arr[r])
{
swap(arr[i], arr[r]);
heapDown(r);
}
}
else if (r < n && arr[i] < arr[r])
{
swap(arr[i], arr[r]);
heapDown(r);
if (l < n && arr[i] < arr[l])
{
swap(arr[i], arr[l]);
heapDown(l);
}
}
}
以下是我的输出
i1i2i3i4i5i6i7
p
Active heap: 7 4 6 1 3 2 5
r
Removed 7
r
Removed 6
p
Active heap: 5 3 4 1 2
这是我的老师的示例输出:
p
Active heap : 7 4 6 1 3 2 5
r
Removed 7
r
Removed 6
p
Active heap : 5 4 2 1 3
s
Heapsorted : 1 2 3 4 5
尽管我们的输出完全不同,但我似乎持有最大堆原则,即将所有节点左对齐,并使所有节点父节点 > 子节点(在我尝试的每种情况下)。我尝试从头开始编写算法,所以可能我做了一些非常奇怪和错误的事情(如果它的时间复杂度 > O(lg n),我才会考虑将其视为“错误”,因为删除操作是用于堆的)。我的删除方式有什么特别的“错误”吗?谢谢。 http://ideone.com/PPh4eQ