【问题标题】:Implemenation Of A Min Heap Using An Array使用数组实现最小堆
【发布时间】:2020-02-23 15:36:34
【问题描述】:

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

# 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

有人可以帮我指出这里的错误吗?

【问题讨论】:

  • 你总是把你的父母换成正确的孩子,所以你的程序运行良好
  • @pandygiankoulidis,你建议我怎么做?
  • @klutt,链接中的实现没有帮助。我仍然没有得到预期的输出。
  • 那么,您的代码到底应该做什么?构建堆通常涉及一次插入一个,每次插入都有一个从下到上的步骤 - 我没有看到,但我可能会遗漏一些东西。从上到下的步骤通常在移除最小的项目时完成。所以,我认为你的代码中有一些关于你在做什么以及为什么做的内容,以及你在纸上为构建堆所做的一些指示。 FWIW 你的论文列表看起来很适合我一次插入一个。

标签: c arrays heap min-heap


【解决方案1】:

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

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

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

将每个元素单独添加到最小堆和将数组作为一个整体最小堆,这两种情况会导致您感到困惑。

【讨论】:

  • 如何单独向堆中添加元素??
  • 如果你有一个使用元素 0..N-1 的堆大小 N,通常,你会在 N 处向数组中添加一个新元素,然后将其冒泡。堆永远不会与 N 以上的元素交互. 如果你已经有一个数据数组,你将元素 1 冒泡到现有的 1 元素堆,然后将元素 2 冒泡到 2 元素堆,依此类推,直到你的所有数组都冒泡,此时你的数组完全堆满了。有趣的说明:现有的排序数组是一个有效的堆,尽管它可能需要反转。
【解决方案2】:

您的程序运行正常。是你的计算有问题。
步骤的简单可视化如下。

    90     heapify(Arr,1)
   /  \    swap(1,3)
 >70   10   
 / \
30  50



   >90     heapify(Arr,0)
   /  \    swap(0,2)
  30   10   
 / \
70  50



    10   
   /  \   
  30   90   
 / \
70  50

生成的 minheap 应该是 10 30 90 70 50

【讨论】:

    猜你喜欢
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 2014-08-14
    • 2015-08-17
    • 2021-12-30
    • 2016-09-18
    相关资源
    最近更新 更多