【问题标题】:How to implement heap with recursion如何使用递归实现堆
【发布时间】:2020-07-21 15:22:36
【问题描述】:

我一直在尝试用 "C" 语言实现堆(这是最大堆),但问题是我没有得到合适的从它的输出,在insert函数下面的代码中,将输入数据和为堆创建的数组的地址作为参数,然后检查数据是否大于它的父节点,如果数据结果更大,然后它将放置在父索引上的较小值替换为放置在数据索引上的较高值,并重复该过程直到它满足最大堆的属性或直到达到根,这里parent的索引表示为heap[i-1]/2,而新增数据的索引就是"i"heap[i] 假设我输入 20,然后如果我输入一个更大的值,比如 30,那么输出应该是 30 20 但我只得到 30 的输出,如果决定添加另一个更大的值(比如 40),那么它将替换 30 和输出变成只有 40。 这是代码->

int i = 0;
void insert(int heap[],int data)
{
    int j = 0;
    if(i == 0)
        {
            heap[i] = data;
        }
        else if(heap[(i-1)/2] < data)
        {
            heap[i] = heap[(i-1)/2];
            i = (i-1)/2;
            insert(heap,data);

        }
}
void display(int heap[],int size)
{
    system("cls");
    for(int i=0,j=1;i<size;i++,j++)
    {
        printf("%d.) %d\n",j,heap[i]);
    }
}

void main()
{
    int heap[5],men,data,c;
    while(1)
    {
        system("cls");

        printf("1.) Insert\n");
        printf("2.) Display\n");
        printf("3.) exit\n");
        printf("Enter your choice : ");
        scanf("%d",&men);
        switch(men)
        {
            case 1 : printf("Enter data : ");
                     scanf("%d",&data);
                     heap[i] = data;
                     insert(heap,data);
                     i++;
                     printf("%d successfully added to heap!",data);
                     break;

            case 2 : display(heap,i);
                    break;

            case 3 : exit(0);
            break;

            default : printf("Invalid choice!");
                      while((c=fgetc(stdin))!='\n'){}
                      break;            
        }
        getch();
    }

}

【问题讨论】:

  • 请不要为 C 问题标记 C++。它们是不同的语言。
  • 您使用相同的变量i 来维护堆并跟踪堆的大小。你应该把它们分开。
  • @valarMorghulis 是的!你是对的,我刚才也意识到了同样的事情,谢谢你的回答!

标签: c arrays recursion heap


【解决方案1】:

insert 方法的问题在于,您永远不会向数组中添加任何内容,除非i==0

将项目添加到最小堆的算法是:

Add new item to the end of the array.
While the new item is smaller than its parent
    swap new item with parent item

翻译成伪代码并优化了一下,就变成了:

count = count + 1
i = count - 1
parent = (i-1)/2
while (data < a[parent])
    a[i] = a[parent])
    i = parent
    parent = (i-1)/2
a[i] = data

递归版本几乎相同。

您的代码永远不会增加计数,因此堆不会增长。

【讨论】:

  • 嗨。 .Jim 感谢您的回答,所以实际上在您发布答案之前,我也在分析我的代码并发现与您指出的相同的事情,唯一的区别是有问题的代码是针对最大堆的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
  • 2015-08-14
  • 2011-06-16
  • 1970-01-01
相关资源
最近更新 更多