对于这项任务,我正在使用堆来构建优先级队列,从最低优先级到最高优先级排序。我创建了一个结构,它有两个成员,值和优先级。为了正确定位每个节点的子节点,我需要跟踪它的位置。我最初在struct,location中有第三个元素,它被设置为等于heap_size,因为节点是在数组的末尾添加的。
heaptype Heap::getleft (heaptype *A, heaptype& node)
{
heaptype lchild;
lchild.location = 2*node.location;
for(int i =0 ; i <heapsize; i++)
{
if(A[i].location == lchild.location)
{
lchild=A[i];
}
return lchild;
}
void Heap::heapifyup(heaptype *A, heaptype &node)
{
heaptype min;
heaptype r = getright(A, node);
heaptype l = getleft(A, node);
if(l.location<=heapsize && l.priority<node.priority)
{
min = l;
}
else
{
min = node;
}
if(r.location<=heapsize && r.priority<l.priority)
{
min = r;
}
if(min.priority!=node.priority)
{
swap(min, node);
heapifyup(A, min);
}
}
void Heap::swap (heaptype& a, heaptype& b)
{
heaptype temp;
temp.id = a.id;
a.id = b.id;
b.id = temp.id;
temp.priority = a.priority;
a.priority = b.priority;
b.priority = temp.priority;
}
这个程序将正确地交换我发送给它的节点的id和优先级,但在我调用swap函数后,我正在使用的数组将两个节点分配给优先级最低的节点的值和优先级。 。 有没有办法修复我现在的程序,还是有更有效的方法来跟踪节点的位置?