【发布时间】: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 你的论文列表看起来很适合我一次插入一个。