c - 使用数组实现最小堆

标签 c arrays heap min-heap

我正在尝试编写一个程序来使用数组表示最小堆。我知道最小堆类似于树数据结构,其中根节点小于它的子节点。这是我的代码:-

# include <stdio.h>
# include <math.h>

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

int rightChild(int i)
{
    return 2 * i + 2;
}

void minHeap(int Arr[], int n, int i)
{
    int l, r, Least;
    l = leftChild(i);
    r = rightChild(i);
    Least = i;

    if(l < n && Arr[l] < Arr[Least])
        Least = l;

    if(r < n && Arr[r] < Arr[Least])
        Least = r;

    if(Least != i)
    {
        int Temp = Arr[i];
        Arr[i] = Arr[Least];
        Arr[Least] = Temp;
        minHeap(Arr, n, Least);
    }
}

int main(void) 
{
    int n;
    printf("\nEnter number of elements : ");
    scanf("%d", &n);

    printf("\nEnter The Elements : ");
    int Arr[n];

    for(int i = 0 ; i < n ; i++)
    {
       scanf("%d", &Arr[i]);
    }

    for(int i = n / 2 - 1 ; i >= 0 ; i--)
      minHeap(Arr, n, i);

    printf("\nMin Heap : ");

    for(int i = 0 ; i < n ; i++)
     printf("%d ", Arr[i]);
    return 0;
}


Input : 
Enter number of elements : 5
Enter the elements : 90 70 10 30 50
Output : 10 30 90 70 50 

但是,当我尝试在纸上构建堆时,这是我得到的输出:-

Expected Output : 10 30 70 90 50

谁能帮我指出这里的错误?

最佳答案

您的代码给出的输出是有效输出。

现在,当您将每个元素单独添加到最小堆时,您将获得预期的输出。

在这里,您正在对整个阵列进行尝试。这就是你感到困惑的原因。

将每个元素单独添加到最小堆和最小堆化整个数组,是您感到困惑的两种情况。

关于c - 使用数组实现最小堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58589762/

相关文章:

c - 将 ncurses 窗口保持在前台

c - 降低单词搜索程序的时间复杂度

javascript - 在 reduce 中连接同一对象属性中的值

arrays - 在perl中创建数组的数组并从数组中删除

php - 在PHP文件中查找多行字符串

heap - 对象是堆中最小的可分页单元吗?

algorithm - 二叉堆 : more efficient way for initial build than successive inserts?

c++ - 在文本文件中查找 10 个最大数量行,其中包含 shipment ID 、 UPC code 、 quantity

python - PyVarObject 的实际使用,cpython 的 PyObject 的可变长度子类型

c - 带有 unsigned char 的 Mod 运算符