C++ 如何在C++;?

C++ 如何在C++;?,c++,arrays,sorting,C++,Arrays,Sorting,这个程序应该能正常工作,但它不能!假设您正在通过将nmubers插入数组来构建minheap。每次插入后都应该使用Heapify函数,以确保数字的排序不违反minheap规则。这是我写的,但有点不对劲,我做不到 int P(int i) //returning the index of parent { if (i % 2 == 0) { i = ((i - 2) / 2); } else { i = ((i - 1) / 2); } return i; } void

这个程序应该能正常工作,但它不能!假设您正在通过将nmubers插入数组来构建minheap。每次插入后都应该使用Heapify函数,以确保数字的排序不违反minheap规则。这是我写的,但有点不对劲,我做不到

int P(int i) //returning the index of parent
{

    if (i % 2 == 0) { i = ((i - 2) / 2); }
    else { i = ((i - 1) / 2); }
    return i;
}

void Heapify(double A[], int i)//putting the smallest value in the root because we have a min heap
{
    if (P(i) != NULL && A[i] < A[P(i)])
    {
        temp = A[P(i)];
        A[P(i)] = A[i];
        A[i] = temp;
        Heapify(A, P(i));
    }
}
int P(int i)//返回父级的索引
{
如果(i%2==0){i=((i-2)/2);}
else{i=((i-1)/2);}
返回i;
}
void Heapify(double A[],int i)//将最小的值放入根中,因为我们有一个最小的堆
{
如果(P(i)!=NULL&&A[i]
一般来说,您的heapify函数似乎没有考虑到最小的左分支和右分支。让我向您展示一个理想的工作实现(面向对象,因此您可能希望将堆作为参数传递)。你可以在互联网上找到精确的伪代码,所以我并不是在展示任何独特的东西

void Heap::Heapify (int i)
{
    int l = left(i);
    int r = right(i);
    int lowest;

    if (l < heap_size && heap[l] -> value < heap[i] -> value )
        lowest = l;
    else
        lowest = i;
    if (r < heap_size && heap[r] -> value < heap[lowest] -> value)
        lowest = r;
    if (lowest != i)
    {
        swap (heap[i], heap[lowest]);
        Heapify(lowest);
    }
}

如您所见,算法首先检查左、右两个子项中哪个值较低。该值将与当前值交换。这就是它的全部。

你怎么知道它有问题?除非你是出于学术原因,否则你可以使用
p(i)!=空值
?我想你是直接从Java或类似的东西翻译过来的?@Manu343726在Java中没有类似的东西是有效的。我在这本书中没有看到任何东西不仅仅是简单的ol'C。我不知道为他做作业是否是最好的答案。@JasonC虽然我意识到这一点,我觉得heapify是一个非常普通的算法,人们不需要在一段时间内重新发明它。
int left    ( int i ) { return 2 * i; }
int right   ( int i ) { return 2 * i + 1; }