繁体   English   中英

如何在C ++中使用数组堆积minheap?

[英]How to heapify the minheap using an array in C++?

这个程序应该正常工作,但事实并非如此! 假设您通过将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));
    }
}

一般来说,您的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);
    }
}

哪里

int left    ( int i ) { return 2 * i; }
int right   ( int i ) { return 2 * i + 1; }

如您所见,算法首先检查左右儿童中哪一个具有较低值。 该值与当前值交换。 这就是它的一切。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM