C Heapsort算法

C Heapsort算法,c,algorithm,heapsort,clrs,C,Algorithm,Heapsort,Clrs,我正在根据CLRS用C实现heapsort算法。但是,我无法获得排序输出。你能看一下我的代码有什么问题吗。函数maxheap和buildmaxheap起作用。我不知道代码出了什么问题 代码应该堆出数组元素。我觉得heapsort()函数中有错误,因为maxheap和buildmaxheap工作正常 我得到的最终结果是 1 1 1 1 2 1 2 2 1 1 但预期产出应该是 1 2 3 4 7 8 9 10 14 16 守则: #include<stdlib.h> #includ

我正在根据CLRS用C实现heapsort算法。但是,我无法获得排序输出。你能看一下我的代码有什么问题吗。函数
maxheap
buildmaxheap
起作用。我不知道代码出了什么问题

代码应该堆出数组元素。我觉得
heapsort()
函数中有错误,因为
maxheap
buildmaxheap
工作正常

我得到的最终结果是

1 1 1 1 2 1 2 2 1 1
但预期产出应该是

1 2 3 4 7 8 9 10 14 16
守则:

#include<stdlib.h>
#include<stdio.h>

#define maxn 11
int n=10;

int parent(int i)
{
    return i/2;
}

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

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

void  max_heap(int x[],int i,int heapsize)
{
    int largest;
    int l=left(i);
    int r=right(i);

    if (l<=heapsize &&  x[l]>x[i]){
        largest=l;
    }
    else
    {
        largest=i;
    }
    if (r<=heapsize && x[r]>x[largest]){
        largest=r;
    }
    if (largest!=i)
    {
        int s=x[i];x[i]=x[largest];x[largest]=s;
        max_heap(x,largest,heapsize);
    }
}

void buildmaxheap(int x[],int heapsize)
{

    int i;
    for(i=5;i>=1;i--)
        max_heap(x,i,heapsize);

}

void heapsort(int x[])
{
    buildmaxheap(x,10);
    int i,t,heapsize=10;
    for(i=10;i>=2;i--)
    {
        int s=x[i];x[1]=x[i];x[i]=s;

        heapsize--;
        /*
         printf("%d",heapsize);
         */
        max_heap(x,i,heapsize);
    }
    for(i=1;i<=10;i++)
        printf("%d\t",x[i]);

}

int main()
{
    int x[maxn],i;
    x[1]=16;
    x[2]=4;
    x[3]=10;
    x[4]=14;
    x[5]=7;
    x[6]=9;
    x[7]=3;
    x[8]=2;
    x[9]=8;
    x[10]=1;
    heapsort(x);
    /*
     for(i=1;i<=10;i++)
     printf("%d\t",x[i]);
     */
}
#包括
#包括
#定义maxn 11
int n=10;
int父级(int i)
{
返回i/2;
}
左整数(整数i)
{
返回2*i+0;
}
右整数(整数i)
{
返回2*i+1+0;
}
void max_堆(int x[],int i,int heapsize)
{
int最大;
int l=左(i);
int r=右(i);
if(lx[i]){
最大=l;
}
其他的
{
最大=i;
}
如果(rx[最大]){
最大=r;
}
如果(最大!=i)
{
int s=x[i];x[i]=x[最大];x[最大]=s;
最大堆(x,最大,堆化);
}
}
void buildmaxheap(int x[],int heapsize)
{
int i;
对于(i=5;i>=1;i--)
最大堆(x,i,heapsize);
}
无效堆端口(int x[])
{
buildmaxheap(x,10);
inti,t,heapsize=10;
对于(i=10;i>=2;i--)
{
int s=x[i];x[1]=x[i];x[i]=s;
医治--;
/*
printf(“%d”,heapsize);
*/
最大堆(x,i,heapsize);
}

对于(i=1;i而言,heapsort中缺乏逻辑。任何排序算法都必须比较2个值,一个值小于,另一个值大于,如果相同,则不做任何处理。目前,您自动将比较器与索引1交换多次

我不清楚为什么它会失去数字,导致随机的1和2,但它看起来太坏了,我不会再给你时间了,直到你再试一次

在数组中,数组索引从0开始,不要在这个小的10节点疑难中避免它。这没什么大不了的。但是如果你不开始自动考虑零是第一次的话,你将付出巨大的时间。

这行:

int s=x[i];x[1]=x[i];x[i]=s;
看起来它正在尝试进行交换,但它混淆了。请查看索引并考虑顺序


修复后,还有一个bug。我没有这本书,所以我不知道它到底告诉了你怎么做,但我相信在删除元素后,你需要从根开始修复heap属性,而你的代码没有这样做。

到底是什么不起作用?好吧,它浪费了x[0]。首先。我不信任具有“1..”索引的C数组,即使在开始时声明为超大:(heapsort函数。这是我在heapsort函数之后打印数组后得到的输出:1.2.11.使用调试器。2.C中的数组是基于零的,而不是基于一的。不要从这一事实出发运行;接受它。3.在具有堆pr的数组中,索引
I
处的元素属性可能在插槽
2*i+1
2*(i+1)
处有子项,受总序列长度
N
的限制(这意味着如果其中任何一个计算值等于或大于
N
,则该子项不存在)。您需要向该问题添加更多详细信息,否则该问题将作为非主题关闭:
寻求调试帮助的问题(“此代码为什么不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现问题所需的最短代码。没有明确问题说明的问题对其他读者没有用处